设置环境。ansible apt 模块中的变量

Nat*_*igh 4 ubuntu ansible

我正在使用 ansibleapt模块在 Ubuntu 主机上安装软件包:

---
-name: Install htop
  apt: name=htop state=present
Run Code Online (Sandbox Code Playgroud)

我现在想安装sudo-ldap,但按照我上面所做的操作不起作用:

---
-name: Install sudo-ldap
  apt: name=sudo-ldap state=present
Run Code Online (Sandbox Code Playgroud)

安装sudo-ldap需要export SUDO_FORCE_REMOVE=yes事先设置。如果我要在命令行上执行此操作,我会执行以下操作:

SUDO_FORCE_REMOVE=yes apt-get install -y sudo-ldap
Run Code Online (Sandbox Code Playgroud)

事实上,我已经在我的 ansible 任务中使用了它:

---
- name: Install sudo-ldap
  shell: SUDO_FORCE_REMOVE=yes apt-get install -y sudo-ldap
  args:
    creates: "/etc/sudo-ldap.conf"
Run Code Online (Sandbox Code Playgroud)

但是一定有更好的方法来设置这个环境变量,这样我就可以apt直接使用模块,而不是去shell?

小智 5

您可以为每个任务设置环境变量,如下所示:

---
- name: Install sudo-ldap
  apt: name=sudo-ldap state=present
  environment:
    SUDO_FORCE_REMOVE: yes
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道它很旧,但SUDO_FORCE_REMOVE: yes不会工作。我们可以看到这里yes变成了True

<192.168.33.11> SSH: EXEC ssh -o ControlMaster=auto -o ControlPersist=60s -o     StrictHostKeyChecking=no -o     'IdentityFile=".vagrant/machines/anyserver/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=vagrant -o ConnectTimeout=10 -o ControlPath=/home/mrbits/.ansible/cp/ansible-ssh-%h-%p-%r -tt 192.168.33.11 '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-vmofyrkeoiwkculfgovhifhhoylkbfrj; **SUDO_FORCE_REMOVE=True** /usr/bin/python /home/vagrant/.ansible/tmp/ansible-tmp-1487325724.54-173290784938544/apt.py; rm -rf "/home/vagrant/.ansible/tmp/ansible-tmp-1487325724.54-173290784938544/" > /dev/null 2>&1'"'"'"'"'"'"'"'"' && sleep 0'"'"''
Run Code Online (Sandbox Code Playgroud)

apt 期望在"yes"上有一个值SUDO_FORCE_REMOVE,所以正确的方法是:

---
- name: Install sudo-ldap
  apt: name=sudo-ldap state=present
  environment:
    SUDO_FORCE_REMOVE: "yes"
Run Code Online (Sandbox Code Playgroud)

只有我的 2 美分。

干杯

  • @Sasha,我遇到了与上面相同的问题,使用引号确实解决了问题。对于 Ansible 来说,“yes”和“True”是一回事,但是对于 Ansible 正在调用的外部代码,无论是安装程序还是从 shell 调用的其他程序,这取决于外部程序想要怎么做处理“是”和“真”。如果外部程序期望的是 `yes`,Ansible 需要将该变量设置为 `yes`。如果没有引号,Ansible 会将变量设置为 `True`。 (2认同)