Ansible - 循环 with_fileglob - become_user 不工作 - 运行 在源机器上的操作
Ansible - Loops with_fileglob - become_user not working -- running action on source machine
环境是:Ansible 1.9.4 或 1.9.2,Linux CentOS 6.5
我有一个角色 build 其中:
$猫roles/build/defaults/main.yml:
---
build_user: confman
build_group: confman
tools_dir: ~/tools
$猫roles/build/tasks/main.yml
- debug: msg="User is = {{ build_user }} -- {{ tools_dir }}"
tags:
- koba
- name: Set directory ownership
file: path="{{ tools_dir }}" owner={{ build_user }} group={{ build_group }} mode=0755 state=directory recurse=yes
become_user: "{{ build_user }}"
tags:
- koba
- name: Set private key file access
file: path="{{ item }}" owner={{ build_user }} group={{ build_group }} mode=0600 state=touch
with_fileglob:
- "{{ tools_dir }}/vmwaretools-lib-*/lib/insecure_private_key"
# with_items:
# - ~/tools/vmwaretools/lib/insecure_private_key
become_user: "{{ build_user }}"
tags:
- koba
在我的工作区中:hosts 文件(清单)包含:
[ansible_servers]
server01.project.jenkins
site.yml(剧本)包含:
---
- hosts: ansible_servers
sudo: yes
roles:
- build
我是运行以下命令:
$ ansible-playbook site.yml -i hosts -u confman --private-key ${DEPLOYER_KEY_FILE} -t koba
我收到以下错误,出于某种原因,在使用 Ansible 循环时在 Ansible 中 become_user:with_fileglob 是 NOT 使用 ~ (主目录)的 confman 用户(设置在变量 {{ build_user }},取而代之的是选择我自己的用户 ID (c123456).
在调试操作的控制台输出中,很明显用户(由于 become_user)是 confman,tools_dir 变量的值是 ~/tools。
PLAY [ansible_servers] ********************************************************
GATHERING FACTS ***************************************************************
ok: [server01.project.jenkins]
TASK: [build | debug msg="User is = {{ build_user }} -- {{ tools_dir }}"] *****
ok: [server01.project.jenkins] => {
"msg": "User is = confman -- ~/tools"
}
TASK: [build | Set directory ownership] ***************************************
changed: [server01.project.jenkins]
TASK: [build | Set private key file access] ***********************************
failed: [server01.project.jenkins] => (item=/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key) => {"failed": true, "item": "/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key", "parsed": false}
BECOME-SUCCESS-ajtxlfymjcquzuolgfrrxbssfolqgrsg
Traceback (most recent call last):
File "/tmp/ansible-tmp-1449615824.69-82085663620220/file", line 1994, in <module>
main()
File "/tmp/ansible-tmp-1449615824.69-82085663620220/file", line 372, in main
open(path, 'w').close()
IOError: [Errno 2] No such file or directory: '/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key'
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: auto-mux: Trying existing master
debug1: mux_client_request_session: master session id: 2
debug1: mux_client_request_session: master session id: 2
Shared connection to server01.project.jenkins closed.
根据上面的错误,它为变量 item 尝试的文件是 /user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key 但在我的用户 ID 的主目录中没有这样的文件。但是,此文件确实存在于用户 confman 的主目录中。
即存在以下文件。
/user/home/confman/tools/vmwaretools-lib-1.0.7-SNAPSHOT/lib/insecure_private_key
/user/home/confman/tools/vmwaretools-lib-1.0.7/lib/insecure_private_key
/user/home/confman/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key
所有,我想要的是在包含私钥文件的 ~confman/tools/vmwaretools-lib-*/.. 位置迭代这些文件并更改权限但使用“with_fileglob " become_user 在操作期间设置用户 NOT 工作。
如果我注释掉with_fileglob部分和use/uncommentwith_items部分tasks/main.yml,然后它 (become_user) 工作正常并选择 ~confman(而不是 ~c123456)并给出以下输出:
TASK: [build | Set private key file access] ***********************************
changed: [server01.project.jenkins] => (item=~/tools/vmwaretools/lib/insecure_private_key)
我发现的一个奇怪的事情是,目标机器上没有用户 c123456 (server01.project.jenkins),这告诉我 with_fileglob 正在使用 source/local/master Ansible 机器(我在其中使用 运行 ansible-playbook 命令)来查找 GLOB 模式(而不是查找 / 运行 它server01.project.jenkins 服务器上的 SSH),确实在 local/source Ansible 机器上,我以 c123456 身份登录。奇怪的是,在输出中,它仍然显示目标机器,但模式路径根据上面的输出来自源机器。
failed: [server01.project.jenkins]
任何想法!我在这里缺少什么?谢谢。
PS:
- 我不想设置 tools_dir: "~{{ build_user }}/tools" 或硬编码它,因为用户可以传递 tools_dir 命令行变量(而 运行 ansible-playbook 命令使用 -e / --extra-vars "tools_dir=/production/slave/tools"
- 进一步研究,我发现 with_fileglob 用于 List of local files 迭代,描述使用 shell fileglob 表示法(例如,/playbooks/files/fooapp/*)那么,我应该使用什么来使用模式匹配(fileglob)在 target/remote 服务器(在我的例子中是 server01.project.jenkins 上进行迭代?
使用 with_fileglob,它将始终 运行 在您 运行 宁 ansible-playbook/ansible 所在的 local/source/master 机器上。循环的 Ansible 文档没有阐明此信息 (http://docs.ansible.com/ansible/playbooks_loops.html#id4) but I found this clarification here: https://github.com/lorin/ansible-quickref
因此,在查找模式时,它正在为用户 c123456 选择 ~。
控制台输出显示 [server01.project.jenkins],因为它是一个不同的 processing/step 来读取 inventory/hosts 文件中的内容。
我尝试使用 with_lines 以及 post: ansible: Is there something like with_fileglobs for files on remote machine?
但是,当我尝试以下操作时,它仍然不起作用,即在本地机器上读取模式而不是目标机器(Ansible 文档告诉 with_items 在本地机器上不 运行但在控制机器上):
file: path="{{ item }}" ....
with_items: ls -1 {{ tools_dir }}/vmwaretools-lib-*/lib/insecure_private_key
become_user: {{ build_user }}
最后为了解决这个问题,我只是使用 shell 进行普通的 OS 命令回合(同样,如果目标环境不是 Linux 输入 OS) 但现在我很好。
- name: Set private key file access
shell: "chmod 0400 {{ tools_dir }}/vmtools-lib-*/lib/insecure_private_key"
become_user: "{{ build_user }}"
tags:
- koba
环境是:Ansible 1.9.4 或 1.9.2,Linux CentOS 6.5
我有一个角色 build 其中:
$猫roles/build/defaults/main.yml:
---
build_user: confman
build_group: confman
tools_dir: ~/tools
$猫roles/build/tasks/main.yml
- debug: msg="User is = {{ build_user }} -- {{ tools_dir }}"
tags:
- koba
- name: Set directory ownership
file: path="{{ tools_dir }}" owner={{ build_user }} group={{ build_group }} mode=0755 state=directory recurse=yes
become_user: "{{ build_user }}"
tags:
- koba
- name: Set private key file access
file: path="{{ item }}" owner={{ build_user }} group={{ build_group }} mode=0600 state=touch
with_fileglob:
- "{{ tools_dir }}/vmwaretools-lib-*/lib/insecure_private_key"
# with_items:
# - ~/tools/vmwaretools/lib/insecure_private_key
become_user: "{{ build_user }}"
tags:
- koba
在我的工作区中:hosts 文件(清单)包含:
[ansible_servers]
server01.project.jenkins
site.yml(剧本)包含:
---
- hosts: ansible_servers
sudo: yes
roles:
- build
我是运行以下命令:
$ ansible-playbook site.yml -i hosts -u confman --private-key ${DEPLOYER_KEY_FILE} -t koba
我收到以下错误,出于某种原因,在使用 Ansible 循环时在 Ansible 中 become_user:with_fileglob 是 NOT 使用 ~ (主目录)的 confman 用户(设置在变量 {{ build_user }},取而代之的是选择我自己的用户 ID (c123456).
在调试操作的控制台输出中,很明显用户(由于 become_user)是 confman,tools_dir 变量的值是 ~/tools。
PLAY [ansible_servers] ********************************************************
GATHERING FACTS ***************************************************************
ok: [server01.project.jenkins]
TASK: [build | debug msg="User is = {{ build_user }} -- {{ tools_dir }}"] *****
ok: [server01.project.jenkins] => {
"msg": "User is = confman -- ~/tools"
}
TASK: [build | Set directory ownership] ***************************************
changed: [server01.project.jenkins]
TASK: [build | Set private key file access] ***********************************
failed: [server01.project.jenkins] => (item=/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key) => {"failed": true, "item": "/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key", "parsed": false}
BECOME-SUCCESS-ajtxlfymjcquzuolgfrrxbssfolqgrsg
Traceback (most recent call last):
File "/tmp/ansible-tmp-1449615824.69-82085663620220/file", line 1994, in <module>
main()
File "/tmp/ansible-tmp-1449615824.69-82085663620220/file", line 372, in main
open(path, 'w').close()
IOError: [Errno 2] No such file or directory: '/user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key'
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: auto-mux: Trying existing master
debug1: mux_client_request_session: master session id: 2
debug1: mux_client_request_session: master session id: 2
Shared connection to server01.project.jenkins closed.
根据上面的错误,它为变量 item 尝试的文件是 /user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key 但在我的用户 ID 的主目录中没有这样的文件。但是,此文件确实存在于用户 confman 的主目录中。
即存在以下文件。
/user/home/confman/tools/vmwaretools-lib-1.0.7-SNAPSHOT/lib/insecure_private_key
/user/home/confman/tools/vmwaretools-lib-1.0.7/lib/insecure_private_key
/user/home/confman/tools/vmwaretools-lib-1.0.8-SNAPSHOT/lib/insecure_private_key
所有,我想要的是在包含私钥文件的 ~confman/tools/vmwaretools-lib-*/.. 位置迭代这些文件并更改权限但使用“with_fileglob " become_user 在操作期间设置用户 NOT 工作。
如果我注释掉with_fileglob部分和use/uncommentwith_items部分tasks/main.yml,然后它 (become_user) 工作正常并选择 ~confman(而不是 ~c123456)并给出以下输出:
TASK: [build | Set private key file access] ***********************************
changed: [server01.project.jenkins] => (item=~/tools/vmwaretools/lib/insecure_private_key)
我发现的一个奇怪的事情是,目标机器上没有用户 c123456 (server01.project.jenkins),这告诉我 with_fileglob 正在使用 source/local/master Ansible 机器(我在其中使用 运行 ansible-playbook 命令)来查找 GLOB 模式(而不是查找 / 运行 它server01.project.jenkins 服务器上的 SSH),确实在 local/source Ansible 机器上,我以 c123456 身份登录。奇怪的是,在输出中,它仍然显示目标机器,但模式路径根据上面的输出来自源机器。
failed: [server01.project.jenkins]
任何想法!我在这里缺少什么?谢谢。
PS: - 我不想设置 tools_dir: "~{{ build_user }}/tools" 或硬编码它,因为用户可以传递 tools_dir 命令行变量(而 运行 ansible-playbook 命令使用 -e / --extra-vars "tools_dir=/production/slave/tools"
- 进一步研究,我发现 with_fileglob 用于 List of local files 迭代,描述使用 shell fileglob 表示法(例如,/playbooks/files/fooapp/*)那么,我应该使用什么来使用模式匹配(fileglob)在 target/remote 服务器(在我的例子中是 server01.project.jenkins 上进行迭代?
使用 with_fileglob,它将始终 运行 在您 运行 宁 ansible-playbook/ansible 所在的 local/source/master 机器上。循环的 Ansible 文档没有阐明此信息 (http://docs.ansible.com/ansible/playbooks_loops.html#id4) but I found this clarification here: https://github.com/lorin/ansible-quickref
因此,在查找模式时,它正在为用户 c123456 选择 ~。
控制台输出显示 [server01.project.jenkins],因为它是一个不同的 processing/step 来读取 inventory/hosts 文件中的内容。
我尝试使用 with_lines 以及 post: ansible: Is there something like with_fileglobs for files on remote machine?
但是,当我尝试以下操作时,它仍然不起作用,即在本地机器上读取模式而不是目标机器(Ansible 文档告诉 with_items 在本地机器上不 运行但在控制机器上):
file: path="{{ item }}" ....
with_items: ls -1 {{ tools_dir }}/vmwaretools-lib-*/lib/insecure_private_key
become_user: {{ build_user }}
最后为了解决这个问题,我只是使用 shell 进行普通的 OS 命令回合(同样,如果目标环境不是 Linux 输入 OS) 但现在我很好。
- name: Set private key file access
shell: "chmod 0400 {{ tools_dir }}/vmtools-lib-*/lib/insecure_private_key"
become_user: "{{ build_user }}"
tags:
- koba