Python自动化运维之ansible的条件语句和循环语句

一 条件语句

1 点睛

有时候一个playbook的结果取决于一个变量,或者取决于上一个任 务(task)的执行结果值,在某些情况下,一个变量的值可以依赖于其他变量的值,当然也会影响Ansible的执行过程。

2 when声明

2.1 点睛 

有时候我们想跳过某些主机的执行步骤,比如符合特定版本的操 作系统将不安装某个软件包,或者磁盘空间爆满了将进行清理的步骤。 在Ansible中很容易做到这一点,通过When子句实现,其中将引用Jinja2 表达式。

2.2 示例

tasks:
  - name: "shutdown Debian flavored systems"
    command: /sbin/shutdown -t now
    when: ansible_os_family == "Debian"

2.3 说明

通过定义任务的Facts本地变量ansible_os_family(操作系统版本名 称)是否为Debian,结果将返回BOOL类型值,为True时将执行上一条 语句command:/sbin/shutdown-t now,为False时该条语句都不会触发。

3 实战

3.1 点睛

通过判断一条命令执行结果做不同分支的二级处 理。

3.2 代码

tasks:
  - command: /bin/false
    register: result
    ignore_errors: True
  - command: /bin/something
    when: result|failed
  - command: /bin/something_else
    when: result|success
  - command: /bin/still/something_else
    when: result|skipped

3.3 说明

“when:result|success”的意思为当变量result执行结果为成功状态时,将执行/bin/something_else命令,其他同理,其中success为Ansible内部过滤器方法,返回Ture代表命令运行成功。

二 循环语句

1 点睛

通常一个任务会做很多事情,如创建大量的用户、安装很多包, 或重复轮询特定的步骤,直到某种结果条件为止,Ansible为我们提供了此支持。

2 示例

2.1 代码

- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
     - testuser1
     - testuser2

2.3 说明

这个示例实现了一个批量创建系统用户的功能,with_items会自动循环执行上面的语句“user:name={{item}}state=present groups=wheel”,循环的次数为with_items的元素个数,这里有2个元素, 分别为testuser1、testuser2,会分别替换{{item}}项。

该示例与下面代码等价:

- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2  
  user: name=testuser2 state=present groups=wheel

当然,元素也支持字典的形式

- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

循环也支持列表(List)的形式,不过是通过with_flattened语句来 实现的,例如:

---
# file: roles/foo/vars/main.yml 
packages_base:
  - [ 'foo-package', 'bar-package' ] 
packages_apps:
  - [ ['one-package', 'two-package' ]]
  - [ ['red-package'], ['blue-package']]

以上定义了两个列表变量,分别是需要安装的软件包名,以便后面进行如下引用:

- name: flattened loop demo
  yum: name={{ item }} state=installed
  with_flattened:
     - packages_base
     - packages_apps

通过使用with_flattened语句循环引用定义好的列表变量。

你可能感兴趣的:(python,Python,ansible)