Ansible - 循环with_fileglob - become_user无法正常工作 - 在源计算机

时间:2015-12-08 23:34:12

标签: loops ansible roles ansible-playbook file-globs

环境是:Ansible 1.9.4 1.9.2,Linux CentOS 6.5

我有一个角色构建,其中:

$ cat roles / build / defaults / main.yml

---
build_user: confman
build_group: confman
tools_dir: ~/tools


$ cat 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

在我的工作区中:主机文件(广告资源)包含:

[ansible_servers]
server01.project.jenkins

site.yml (playbook)包含:

---
- 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 正在使用 confman 用户的(主目录)(在变量 {{build_user}} 中设置,而不是那个,它是' s选择我自己的用户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.

根据上述错误,它尝试变量的文件是 /user/home/c123456/tools/vmwaretools-lib-1.0.8-SNAPSHOT/ lib / insecure_private_key 但我的用户ID的主目录中没有这样的文件。但是,该文件确实存在于用户co​​nfman的主目录中。

即。存在以下文件。

/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 - * / ..包含私钥文件的位置迭代这些文件并更改权限但使用&#34; with_fileglob &#34; 成为用户在操作期间设置用户正在工作。

如果我注释掉 with_fileglob 部分并在tasks / main.yml中使用/取消注释 with_items 部分,那么它( 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查找/运行它),它是&#39;是的,在本地/源Ansible机器上,我已登录为c123456。奇怪的是,在OUTPUT中,它仍然显示目标机器,但模式路径来自源机器,按照上面的输出。

failed: [server01.project.jenkins]

任何想法!我在这里失踪了什么?谢谢。

PS: - 我不想设置tools_dir:&#34;〜{{build_user}} / tools&#34;或硬编码,因为用户可以在命令行传递 tools_dir 变量(使用-e / --extra-vars运行ansible-playbook命令&#34; tools_dir = / production / slave / tools&#34 ;

  • 进一步研究它,我发现 with_fileglob 用于本地文件列表进行迭代,使用shell fileglob表示法描述(例如,/ playbooks / files / fooapp / *那么,我应该使用模式匹配(fileglob)来迭代目标/远程服务器(在我的情况下是server01.project.jenkins)?

1 个答案:

答案 0 :(得分:2)

使用with_fileglob,它总是在运行ansible-playbook / ansible的本地/源/主机上运行。针对循环的Ansible文档并未澄清此信息(http://docs.ansible.com/ansible/playbooks_loops.html#id4),但我在此处发现了这一说明:https://github.com/lorin/ansible-quickref

因此,在寻找模式时,它会为用户c123456选择〜。

控制台输出显示[server01.project.jenkins],因为它是一个不同的处理/步骤,用于读取清单/主机文件中的内容。

我尝试使用 with_lines 以及此帖子:ansible: Is there something like with_fileglobs for files on remote machine?

但是,当我尝试以下操作时,它仍然无法工作,即在本地计算机而不是目标计算机上读取模式(Ansible docs告诉with_items不在本地计算机上运行但在控制计算机上运行) :

  file: path="{{ item }}" .... 
  with_items: ls -1 {{ tools_dir }}/vmwaretools-lib-*/lib/insecure_private_key 
  become_user: {{ build_user }}

最后为了解决这个问题,我刚刚使用shell进行了简单的OS命令回合(再次,如果目标env不是Linux类型的操作系统,这可能不是一个很好的解决方案)但是现在我还是好。

- name: Set private key file access
  shell: "chmod 0400 {{ tools_dir }}/vmtools-lib-*/lib/insecure_private_key"
  become_user: "{{ build_user }}"
  tags:
    - koba