为什么 Ansible 忽略了我的 'sudo: False'?

Why Ansible is ignoring my 'sudo: False'?

我打算用ansible部署一个远程文件,由于远程位置只能用'root'写入,而本地文件不能用'root'下载,我使用以下剧本:

# in the main playbook

- hosts: master
  user: ec2-user
  sudo: yes
# in role definition

# download only in the ansible master node
- local_action: get_url url={{ hadoop_mirrors|random }}/hadoop-{{ hadoop_version }}/hadoop-{{ hadoop_version }}.tar.gz dest=/opt/hadoop-{{ hadoop_version }}.tar.gz force=no
  sudo: False
  register: result
  until: result|success
  retries: 5
  delay: 2
  when: hadoop_type_of_node == 'master'

然而 Ansible 似乎无法读取行 sudo: False。当我 运行 这个剧本时,我仍然得到这个错误:

TASK [ansible-role-hadoop : get_url] **************************************************************************************************
FAILED - RETRYING: ansible-role-hadoop : get_url (5 retries left).
FAILED - RETRYING: ansible-role-hadoop : get_url (4 retries left).
FAILED - RETRYING: ansible-role-hadoop : get_url (3 retries left).
FAILED - RETRYING: ansible-role-hadoop : get_url (2 retries left).
FAILED - RETRYING: ansible-role-hadoop : get_url (1 retries left).
fatal: [54.201.26.110 -> localhost]: FAILED! => {"attempts": 5, "changed": false, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 1}
    to retry, use: --limit @/home/peng/git/datapassport/clusterops/ansible/deploy/master.retry

为什么这行没有被读取,我应该如何修复它?

使用 become: false,而不是很久以前就弃用的 sudo: false

sudo 声明仍然保留在 plays 定义中以保持兼容性,但由于某种原因自 Ansible 2.4 以来已不再在任务中维护。


- 不检查任务中的声明(您可以将 foo: bar 添加到任务中,它将被忽略)。这就是为什么您看不到任何 error/warning.

- 另一方面,您应该收到关于 sudo 被弃用的警告。

Privilege Escalation 在 Ansible 中管理很重要。 become 关键字是此能力的运算符。

4 种常见用途:

  • 变成 设置为“true”/“yes”以激活权限升级。
  • become_user 设置为具有所需权限的用户——你“成为”的用户,而不是你登录的用户。不意味着成为:是的,允许它在主机级别设置。
  • become_method (在游戏或任务级别)覆盖 ansible.cfg 中设置的默认方法,设置为 sudo/su/pbrun/pfexec/doas/dzdo/ksu
  • become_flags(在游戏或任务级别)允许为任务或角色使用特定标志。一种常见的用法是在 shell 设置为无登录时将用户更改为 nobody。

所以,sudo:是,像这样使用become:

- hosts: master
  user: ec2-user
  become: false