Ansible lineinfile 给出错误 /etc/hosts

Ansible lineinfile give an error with /etc/hosts

我的角色中有这个简单的任务:

- name: Updating the /etc/hosts
  lineinfile: dest=/etc/hosts line="192.168.99.100  {{ item }}"
  with_items: 
    - domain1.com
    - domain2.com
  tags: etc

当我 运行 我的 Ansible 剧本时:

robe:ansible-develop robe$ ansible-playbook -i inventory develop-env.yml -vvvv --extra-vars "user=`whoami`" --tags etc --become-user=robe --ask-become-pass
SUDO password: 

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
<127.0.0.1> REMOTE_MODULE setup
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p /tmp/ansible-tmp-1446050161.27-256837595805154 && chmod a+rx /tmp/ansible-tmp-1446050161.27-256837595805154 && echo /tmp/ansible-tmp-1446050161.27-256837595805154']
<127.0.0.1> PUT /var/folders/x1/dyrdksh50tj0z2szv3zx_9rc0000gq/T/tmpMYjnXz TO /tmp/ansible-tmp-1446050161.27-256837595805154/setup
<127.0.0.1> EXEC ['/bin/sh', '-c', 'chmod a+r /tmp/ansible-tmp-1446050161.27-256837595805154/setup']
<127.0.0.1> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=rqphpqfpcbsifqtnwflmmlmpwrcnkpqe] password: " -u robe /bin/sh -c '"'"'echo BECOME-SUCCESS-rqphpqfpcbsifqtnwflmmlmpwrcnkpqe; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /tmp/ansible-tmp-1446050161.27-256837595805154/setup'"'"''
<127.0.0.1> EXEC ['/bin/sh', '-c', 'rm -rf /tmp/ansible-tmp-1446050161.27-256837595805154/ >/dev/null 2>&1']
ok: [127.0.0.1]

TASK: [docker-tool-box | Updating the /etc/hosts] ***************************** 
<127.0.0.1> REMOTE_MODULE lineinfile dest=/etc/hosts line="192.168.99.100 ptxrt.com"
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p /tmp/ansible-tmp-1446050161.49-9492873099893 && chmod a+rx /tmp/ansible-tmp-1446050161.49-9492873099893 && echo /tmp/ansible-tmp-1446050161.49-9492873099893']
<127.0.0.1> PUT /var/folders/x1/dyrdksh50tj0z2szv3zx_9rc0000gq/T/tmpyLOGd6 TO /tmp/ansible-tmp-1446050161.49-9492873099893/lineinfile
<127.0.0.1> EXEC ['/bin/sh', '-c', u'chmod a+r /tmp/ansible-tmp-1446050161.49-9492873099893/lineinfile']
<127.0.0.1> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=nofwziqxytbhjwhluhtzdfcqclqjuypv] password: " -u robe /bin/sh -c '"'"'echo BECOME-SUCCESS-nofwziqxytbhjwhluhtzdfcqclqjuypv; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /tmp/ansible-tmp-1446050161.49-9492873099893/lineinfile'"'"''
<127.0.0.1> EXEC ['/bin/sh', '-c', 'rm -rf /tmp/ansible-tmp-1446050161.49-9492873099893/ >/dev/null 2>&1']
failed: [127.0.0.1] => (item=ptxrt.com) => {"failed": true, "item": "ptxrt.com"}
msg: The destination directory (/private/etc) is not writable by the current user.

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/robe/develop-env.retry

127.0.0.1                  : ok=1    changed=0    unreachable=0    failed=1 

我不明白为什么错误消息说:

 msg: The destination directory (/private/etc) is not writable by the current user.

正确的目录应该是/etc/hosts.

有线索吗?

我正在使用 MacOS。

我的剧本是:

- hosts: 127.0.0.1
  connection: local
  become: yes
  become_method: sudo
  become_user: "{{user}}"
  roles:
    - role-1
    - role-2

我通过命令行输入了become_user。所以我所有的角色都是运行成为的。而且还是不行。

在 OSX 上,/etc/ 文件夹实际上是 /private/etc/ 文件夹的符号链接 - 因此出现错误。 (Ansible 只是透明地遵循符号链接)。

至于错误,您需要 运行 具有 become: yes(sudo 权限)的任务才能写入 /etc/hosts/

根据更新和评论进行编辑

要获得编辑主机文件的正确权限,您需要是根用户。对于 OSX,在任务上设置 become: yes 就足够了,因为 Ansible 将默认将 sudo 作为 become 方法,将 root 作为用户。

要指定 sudo 密码,您可以执行以下两项操作之一。

  1. 在命令行中使用--ask-become-pass,Ansible 会在需要时提示你
  2. 在清单文件中对组或主机使用 ansible_become_pass 变量。例如。 localhost ansible_become_pass=batman

请注意,Ansible 文档建议不要使用 2 并使用 1,以免以纯文本形式存储您的密码。