Назад | Перейти на главную страницу

Ansible lineinfile не находит конкретную строку при наличии состояния

Я хотел бы проверить, если admin_token определяется в моем keystone.conf файл. Для этого я хочу использовать Ansible. Однако даже если атрибут присутствует в файле, задача не выполняется.

Я сравнил две задачи с lineinfile модуль (то же регулярное выражение, состояние присутствует, а затем отсутствует). В первом задании Ansible не нашел строчки. Однако он нашел это во втором задании. В файл не вносятся никакие изменения.

Откуда это могло взяться?

PLAY [Docker] ******************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [keystone]

TASK [Check admin_token is present] *******************************************************************************
fatal: [keystone]: FAILED! => {"changed": false, "msg": "line is required with state=present"}
...ignoring

TASK [Check admin_token not present] *******************************************************************************
changed: [keystone]

TASK [debug] *******************************************************************************************************
ok: [keystone] => {
    "comment_admin_token_1": {
        "changed": false,
        "failed": true,
        "msg": "line is required with state=present"
    }
}

TASK [debug] *******************************************************************************************************
ok: [keystone] => {
    "comment_admin_token_2": {
        "backup": "",
        "changed": true,
        "diff": [
            {
                "after": "",
                "after_header": "/etc/keystone/keystone.conf (content)",
                "before": "",
                "before_header": "/etc/keystone/keystone.conf (content)"
            },
            {
                "after_header": "/etc/keystone/keystone.conf (file attributes)",
                "before_header": "/etc/keystone/keystone.conf (file attributes)"
            }
        ],
        "failed": false,
        "found": 1,
        "msg": "1 line(s) removed"
    }
}

PLAY RECAP *********************************************************************************************************

keystone                   : ok=5    changed=1    unreachable=0    failed=0

Здесь после пьесы

- name: Docker
  hosts: containers
  connection: docker
  tasks:
  - name: Check admin_token is present 
    lineinfile:
      path: /etc/keystone/keystone.conf
      regexp: '^admin_token *= *.*'
      state: present
    register: comment_admin_token_disabled
    ignore_errors: yes
    check_mode: yes
  - name: Check admin_token not present 
    lineinfile:
      path: /etc/keystone/keystone.conf
      regexp: '^admin_token *= *.*'
      state: absent
    register: comment_admin_token_disabled
    ignore_errors: yes
    check_mode: yes

В lineinfile модуль предназначен для редактировать файлы, а не просто проверить их содержимое и, следовательно, требует от вас замены line когда вы указываете state=present. Поскольку вы не указали замену, вы получите сообщение об ошибке: "line is required with state=present".

Как решить проблему, зависит от контекста, который вы не указали в своем вопросе. Но я думаю, вам следует установить admin_token в замене line. Например:

    line: "admin_token={{keystone_admin_token}}"