我正在尝试使用python脚本执行以下剧本。
playbook = dict(
name = "Enable Site",
hosts = [host],
gather_facts = 'no',
tasks = [
dict(action=dict(
module='find', args=dict(paths="/etc/apache2/sites-enabled")), register='files_found'),
dict(action=dict(
module='shell', args="cd /etc/apache2/sites-enabled && a2dissite *"), register='shell_out', when='files_found.matched > 0'),
dict(action=dict(module='shell', args="a2ensite " + site_name), register='shell_out'),
dict(action=dict(module='service', args="name='apache2' state='reloaded'"), register='shell_out'),
]
)
这本剧本基本上检查是否启用了任何apache站点(如果是),然后通过从/ etc / apache2 / sites-enabled中删除所有文件来禁用它们。
第二个任务应该在目录
/etc/apache2/sites-enabled
为空时执行。但是条件总是在“何时”被评估为真。即使我写when="False"
。还尝试了when="eval(False)"
最佳答案
如果我将您的playbook
词典转换为常规的Ansible剧本,如下所示:
- name: Enable Site
hosts:
- localhost
gather_facts: no
tasks:
- action:
module: find
args:
paths: /etc/apache2/sites-enabled
register: files_found
- action:
module: shell
args: cd /etc/apache2/sites-enabled && a2dissite *
register: shell_out
when: files_found.matched > 0
- action:
module: shell
args: a2ensite 100-mysite.conf
register: shell_out
- action:
module: service
args: name='apache2' state='reloaded'
register: shell_out
它似乎按预期运行。也就是说,如果我从空的
/etc/apache2/sites-enabled
目录开始,则会看到:PLAY [Enable Site] *******************************************************************
TASK [find] **************************************************************************
ok: [localhost]
TASK [shell] *************************************************************************
skipping: [localhost]
TASK [shell] *************************************************************************
changed: [localhost]
您可以看到它正在跳过第二个Shell任务。但是,请考虑一下您的剧本的作用:
它检查目录是否为空
如果不是,它将禁用所有功能
它将文件安装到目录中
这意味着每次您运行此剧本时,它都会清空
/etc/apache2/sites-enabled
,然后重新启用在site_name
变量中命名的网站。关于python - 使用Python字典编写Ansible剧本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59910992/