当 运行 个带有标签的剧本时,Ansible 注册变量为空
Ansible registered variables are empty when running playbooks with tags
我想每 5 分钟 运行 在剧本上执行一个特定的复制任务。为此,我为该特定任务使用了标签,并使用 --tags 运行 剧本。当我使用 --tags 选项时,注册变量(预任务)传递为空。
我的剧本
---
- name: DNS Master and Slave Configuration Playbook
hosts: "{{ host }}"
become: yes
become_method: sudo
gather_facts: no
connection: ssh
pre_tasks:
- include_tasks: pre_tasks/register_vars.yml
tags: always
roles:
- role1
- role2 (role with the tagged task)
- role3
我在任务中使用“when”条件。如果没有注册的变量,任务将无法运行。
- name: Copy DNS zone files to the server
copy:
src: xx/xx-dns-zones/
dest: /var/named/data/master/
owner: named
group: named
mode: '0644'
when: colo.stdout == 'xx' and 'server1' in fqdn.stdout
notify: reload dns
tags: xx-zone-files
这是我的 pre_tasks 注册 st 和 colo 变量的地方。
---
#pre_tasks
- name: To register colo of the server as variable
shell: /usr/bin/hostname | /bin/awk -F'.' '{print }'
register: colo
- name: To register fqdn of the server as vairble
shell: /usr/bin/hostname
register: fqdn
当我 运行 带有 --tags 的剧本时,注册的变量被传递为空。
$ ansible-playbook dns-playbook.yml -e host=xx-server1 --tags "xx-zone-files"
PLAY [Test Playbook] ***************************************************************************************************
TASK [include_tasks] *********************************************************************************************************************************
Thursday 10 September 2020 10:25:21 +0000 (0:00:00.133) 0:00:00.133 ****
included: /home/ansibleuser/ansible/pre_tasks/register_vars.yml for xx-server1
TASK [dns : Copy DNS zone files to the server] *******************************************************************************************************
Thursday 10 September 2020 10:25:21 +0000 (0:00:00.023) 0:00:00.156 ****
fatal: [xx-server1]: FAILED! => {"msg": "The conditional check 'colo.stdout == 'xx' and 'server1' in fqdn.stdout' failed. The error was: error while evaluating conditional (colo.stdout == 'xx' and 'server1' in fqdn.stdout): 'colo' is undefined\n\nThe error appears to be in '/home/sselvaraj/test/click_ansible/roles/dns/tasks/main.yml': line 96, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n# Copy XX DNS zone files\n- name: Copy DNS zone files to the server\n ^ here\n"}
当我 运行 没有标签的剧本时没有问题。变量注册成功,条件通过
TASK [include_tasks] *********************************************************************************************************************************
Thursday 10 September 2020 10:53:49 +0000 (0:00:00.134) 0:00:00.134 ****
included: /home/ansibleuser/ansible/pre_tasks/register_vars.yml for xx-server1
TASK [To register colo of the server as variable] ****************************************************************************************************
Thursday 10 September 2020 10:53:49 +0000 (0:00:00.021) 0:00:00.156 ****
changed: [xx-server1] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "/usr/bin/hostname | /bin/awk -F'.' '{print }'", "delta": "0:00:00.015379", "end": "2020-09-10 03:53:50.374733", "rc": 0, "start": "2020-09-10 03:53:50.359354", "stderr": "", "stderr_lines": [], **"stdout": "xx"**, "stdout_lines": ["xx"]}
TASK [To register fqdn of the server as vairble] *****************************************************************************************************
Thursday 10 September 2020 10:53:50 +0000 (0:00:00.481) 0:00:00.637 ****
changed: [xx-server1] => {"changed": true, "cmd": "/usr/bin/hostname", "delta": "0:00:00.014439", "end": "2020-09-10 03:53:50.553507", "rc": 0, "start": "2020-09-10 03:53:50.539068", "stderr": "", "stderr_lines": [], **"stdout": "xx-server1.xx.test.com"**, "stdout_lines": ["xx-server1.xx.test.com"]}
我希望在 运行使用 --tags 设置 playbook 时传递已注册的变量。
当您使用 --tags
时,只会执行具有这些标签的任务。那么您可以做的是:
- 给任务加上
always
标签,每次都要执行。他们将 运行 不管 --tags
和 --skip-tags
.
- 为这些任务添加另一个标签,例如
config
,并在您的命令中提供 --tags "xx-zone-files,config"
。
- 将标签
xx-zone-files
添加到这些标签中。
因为看起来这些变量应该总是被注册,我会选择选项一:
---
#pre_tasks
- name: To register colo of the server as variable
shell: /usr/bin/hostname | /bin/awk -F'.' '{print }'
register: colo
tags: always
- name: To register fqdn of the server as vairble
shell: /usr/bin/hostname
register: fqdn
tags: always
我想每 5 分钟 运行 在剧本上执行一个特定的复制任务。为此,我为该特定任务使用了标签,并使用 --tags 运行 剧本。当我使用 --tags 选项时,注册变量(预任务)传递为空。
我的剧本
---
- name: DNS Master and Slave Configuration Playbook
hosts: "{{ host }}"
become: yes
become_method: sudo
gather_facts: no
connection: ssh
pre_tasks:
- include_tasks: pre_tasks/register_vars.yml
tags: always
roles:
- role1
- role2 (role with the tagged task)
- role3
我在任务中使用“when”条件。如果没有注册的变量,任务将无法运行。
- name: Copy DNS zone files to the server
copy:
src: xx/xx-dns-zones/
dest: /var/named/data/master/
owner: named
group: named
mode: '0644'
when: colo.stdout == 'xx' and 'server1' in fqdn.stdout
notify: reload dns
tags: xx-zone-files
这是我的 pre_tasks 注册 st 和 colo 变量的地方。
---
#pre_tasks
- name: To register colo of the server as variable
shell: /usr/bin/hostname | /bin/awk -F'.' '{print }'
register: colo
- name: To register fqdn of the server as vairble
shell: /usr/bin/hostname
register: fqdn
当我 运行 带有 --tags 的剧本时,注册的变量被传递为空。
$ ansible-playbook dns-playbook.yml -e host=xx-server1 --tags "xx-zone-files"
PLAY [Test Playbook] ***************************************************************************************************
TASK [include_tasks] *********************************************************************************************************************************
Thursday 10 September 2020 10:25:21 +0000 (0:00:00.133) 0:00:00.133 ****
included: /home/ansibleuser/ansible/pre_tasks/register_vars.yml for xx-server1
TASK [dns : Copy DNS zone files to the server] *******************************************************************************************************
Thursday 10 September 2020 10:25:21 +0000 (0:00:00.023) 0:00:00.156 ****
fatal: [xx-server1]: FAILED! => {"msg": "The conditional check 'colo.stdout == 'xx' and 'server1' in fqdn.stdout' failed. The error was: error while evaluating conditional (colo.stdout == 'xx' and 'server1' in fqdn.stdout): 'colo' is undefined\n\nThe error appears to be in '/home/sselvaraj/test/click_ansible/roles/dns/tasks/main.yml': line 96, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n# Copy XX DNS zone files\n- name: Copy DNS zone files to the server\n ^ here\n"}
当我 运行 没有标签的剧本时没有问题。变量注册成功,条件通过
TASK [include_tasks] *********************************************************************************************************************************
Thursday 10 September 2020 10:53:49 +0000 (0:00:00.134) 0:00:00.134 ****
included: /home/ansibleuser/ansible/pre_tasks/register_vars.yml for xx-server1
TASK [To register colo of the server as variable] ****************************************************************************************************
Thursday 10 September 2020 10:53:49 +0000 (0:00:00.021) 0:00:00.156 ****
changed: [xx-server1] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "/usr/bin/hostname | /bin/awk -F'.' '{print }'", "delta": "0:00:00.015379", "end": "2020-09-10 03:53:50.374733", "rc": 0, "start": "2020-09-10 03:53:50.359354", "stderr": "", "stderr_lines": [], **"stdout": "xx"**, "stdout_lines": ["xx"]}
TASK [To register fqdn of the server as vairble] *****************************************************************************************************
Thursday 10 September 2020 10:53:50 +0000 (0:00:00.481) 0:00:00.637 ****
changed: [xx-server1] => {"changed": true, "cmd": "/usr/bin/hostname", "delta": "0:00:00.014439", "end": "2020-09-10 03:53:50.553507", "rc": 0, "start": "2020-09-10 03:53:50.539068", "stderr": "", "stderr_lines": [], **"stdout": "xx-server1.xx.test.com"**, "stdout_lines": ["xx-server1.xx.test.com"]}
我希望在 运行使用 --tags 设置 playbook 时传递已注册的变量。
当您使用 --tags
时,只会执行具有这些标签的任务。那么您可以做的是:
- 给任务加上
always
标签,每次都要执行。他们将 运行 不管--tags
和--skip-tags
. - 为这些任务添加另一个标签,例如
config
,并在您的命令中提供--tags "xx-zone-files,config"
。 - 将标签
xx-zone-files
添加到这些标签中。
因为看起来这些变量应该总是被注册,我会选择选项一:
---
#pre_tasks
- name: To register colo of the server as variable
shell: /usr/bin/hostname | /bin/awk -F'.' '{print }'
register: colo
tags: always
- name: To register fqdn of the server as vairble
shell: /usr/bin/hostname
register: fqdn
tags: always