loops - Ansible - 循环 with_fileglob - 成为用户不工作 - 在源机器上运行操作

标签 loops roles ansible file-globs

环境是:Ansible 1.9.4 1.9.2,Linux CentOS 6.5

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

$ cat 角色/build/defaults/main.yml:

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


$ cat 角色/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 文件( list )包含:

[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_fileglobNOT 使用 confman 用户的 >~ (主目录)(在变量 {{ build_user }} 中设置,而不是那样,而是选择我自己的用户 ID( c123456)。

在调试操作的控制台输出中,很明显用户(由于变成_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”<在操作期间设置用户的strong>become_user不起作用

如果我在tasks/main.yml中注释掉with_fileglob部分并使用/取消注释with_items部分,那么它(become_user)工作正常并选择 ~confman (而不是 ~c123456)并给出以下输出:

TASK: [build | Set private key file access] ***********************************
changed: [server01.project.jenkins] => (item=~/tools/vmwaretools/lib/insecure_private_key)

我发现的一件奇怪的事情是,目标计算机(server01.project.jenkins)上没有用户 c123456,这告诉我 with_fileglob 正在使用源/local/master Ansible 机器(我运行 ansible-playbook 命令的地方)来查找 GLOB 模式(而不是在 server01.project.jenkins 服务器上通过 SSH 查找/运行它),确实在本地/源 Ansible 机器上,我以 c123456 身份登录。奇怪的是,在输出中,它仍然显示目标计算机,但根据上面的输出,模式路径来自源计算机。

failed: [server01.project.jenkins]

任何想法!我在这里缺少什么?谢谢。

PS: - 我不想设置 tools_dir: "~{{ build_user }}/tools"或对其进行硬编码,因为用户可以在命令行传递 tools_dir 变量(同时使用 -e 运行 ansible-playbook 命令/--extra-vars“tools_dir=/product/slave/tools”

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

最佳答案

使用 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],因为它是读取 list /主机文件中内容的不同处理/步骤。

我尝试使用with_lines以及这篇文章: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 进行了简单的操作系统命令(同样,如果目标环境不是 Linux 类型的操作系统,这可能不是一个很好的解决方案),但现在我很好。

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

关于loops - Ansible - 循环 with_fileglob - 成为用户不工作 - 在源机器上运行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34168139/

相关文章:

java - Android ,我可以将 NumberPicker 更改为 CharPicker {A+,A,B+,B.C+,C,D+,D,F}

ruby - 如何使用 Ruby 正则表达式从字符串中提取重复字符序列?

java - 通过循环使用 Hashmap 值

ruby-on-rails - 将默认角色添加到 Devise 用户模型

string - 如何向 Ansible 变量添加新行 "\n"字符

java - 完成一个for循环后执行一个for循环

java - struts中无权访问页面时如何重定向到homepage.do?

authorization - 有哪些围绕授权(RBAC 和 ABAC)实现 XACML 等标准的知名产品/服务?

SSH 正常,但 Ansible 返回 "unreachable"

ansible - 在ansible中,有没有办法注册角色的结果?