ansible-playbook编写和使用_ansible playbook 语法

  - name: display Host Variable from hostfile
    debug: msg="The {{inventory\_hostname}} Value is {{key}}"

[root@hadoop1010 nginx]# cat hosts
[nginx]
192.168.10.1[0:2]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.7
key=nginx
[root@hadoop1010 nginx]# cat hosts1
192.168.10.10 key=100
192.168.10.11 key=110
192.168.10.12 key=120
[root@hadoop1010 nginx]# ansible-playbook -i hosts1 variable.yaml

PLAY [all] **************************************************************************************************************************************************************************************

TASK [display Host Variable from hostfile] ******************************************************************************************************************************************************
ok: [192.168.10.10] => {
“msg”: “The 192.168.10.10 Value is 100”
}
ok: [192.168.10.11] => {
“msg”: “The 192.168.10.11 Value is 110”
}
ok: [192.168.10.12] => {
“msg”: “The 192.168.10.12 Value is 120”
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.10 : ok=1 changed=0 unreachable=0 failed=0
192.168.10.11 : ok=1 changed=0 unreachable=0 failed=0
192.168.10.12 : ok=1 changed=0 unreachable=0 failed=0

[root@hadoop1010 nginx]# ansible-playbook -i hosts variable.yaml

PLAY [all] **************************************************************************************************************************************************************************************

TASK [display Host Variable from hostfile] ******************************************************************************************************************************************************
ok: [192.168.10.10] => {
“msg”: “The 192.168.10.10 Value is nginx”
}
ok: [192.168.10.11] => {
“msg”: “The 192.168.10.11 Value is nginx”
}
ok: [192.168.10.12] => {
“msg”: “The 192.168.10.12 Value is nginx”
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.10 : ok=1 changed=0 unreachable=0 failed=0
192.168.10.11 : ok=1 changed=0 unreachable=0 failed=0
192.168.10.12 : ok=1 changed=0 unreachable=0 failed=0


### 2.2 通过/etc/ansible下的文件定义主机以及主机组变量


默认使用yum安装ansible的配置文件时在 /etc/ansible目录下,可以使用该目录下新建host\_vars和group\_vars目录来针对主机和主机组定义变量。**若是用其他方式安装ansible,只需要在playbook文件当前目录下新建这两个目录。**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9865c2d2a70644df93d11266f6d3a274.png)


### 2.3 通过ansile-playbook命令行传入


通过ansible-playbook命令行传参的方式定义变量,默认传进去时全局变量。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/762318ba708945779f9ad544619113d2.png)  
 目前ansible-playbook还支持指定文件的方式传入变量,变量的文件内容支持YAML和JSON两种格式:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/793f4ae3c9974d57a174ead1293490d8.png)


### 2.4 在playbook文件内使用vars


在文件内通过vars字段定义变量:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8dc47bb24b8e4621a493a7d816d0ff6f.png)


### 2.5 在playbook文件内使用var\_files


在playbook文件内通过var\_files字段引用变量,首先把所有的变量定义到某个文件内,然后playbook文件内使用var\_files参数引用这个变量文件。  
 注意:变量文件路径实在playbook下的。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4998f86c29de43b5a17cec6eb5f53b3c.png)


### 2.6 使用register内的变量


ansible playbook内的task之间还可以相互传递数据,比如我们总共有两个task是,其中第2个task执行与否要判断第1个task运行后的结果,这个时候我们就得在task之间传递数据,需要把第1个task执行的结果传递给第2个task。ansible task之间传递数据使用register方式。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fbe1f5589055473484df0d664003b706.png)  
 执行效果:  
 指定标准输出的stdout的信息输出  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7beb2e0607f24f83b39d6e9052fe9003.png)


### 2.7 使用vars\_prompt传入


ansible还支持在运行playbook的时候童话刚刚交互式的方式给定义好的参数传入变量值,只需要在playbook中定义var\_prompt的变量名和交互式提示内容即可。  
 ansible还可以对输入变量值进行加密处理,比如采用SHA512和MD5算法加密。加密方式在可参照之前博客[ansible组件介绍和简单playbook测试]( )。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ceca211346064b2e8d07a336efa03600.png)  
 已经介绍了7种比较常用的定义变量以及如何引用的方式。ansible的变量引用方式相对比较少,都是比较固定的{{key}}或{{key[‘key’]}}或{{key[0][‘key’]}},根据变量的值定义了不同的数据结构,因而变量引用方法稍微有区别。


## 三、playbook循环


在编写playbook的过程中,发现有很多的task都是重复引用某个模块,比如一次想同步10个文件,如果按照以前写playbook的思路需要写10个task,这样的话playbook会显得臃肿。采用loops方式区编写playbook减少重复使用某个模块。


下面介绍几种常见的loops


### 3.1 标准循环


标准loops是我们在编写playbook过程中使用最多的一种loops,它能直接减少编写task的次数。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8bb82a1fea7946fea4c52b2295ec7158.png)  
 with\_items的值时python list数据结构,可以理解为每个task会循环读取list里面的值,然后key的名称时item,list里面也支持python字典。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ea7fe7405680410eb71b7d9030e20aff.png)


### 3.2 嵌套loops



[root@hadoop1010 loops]# cat loopsqt.yaml

  • hosts: all
    gather_facts: False
    tasks:
    • name: give users access to multiple databases
      debug: msg=“name={{ item[0] }} priv={{ item[1] }}”
      with_nested:
      • [ ‘alice’, ‘bob’ ]
      • [ ‘clientdb’, ‘employeedb’, ‘providerdb’ ]
        [root@hadoop1010 loops]# ansible-playbook loopsqt.yaml -l 192.168.10.11

PLAY [all] **************************************************************************************************************************************************************************************

TASK [give users access to multiple databases] **************************************************************************************************************************************************
ok: [192.168.10.11] => (item=[u’alice’, u’clientdb’]) => {
“changed”: false,
“item”: [
“alice”,
“clientdb”
],
“msg”: “name=alice priv=clientdb”
}
ok: [192.168.10.11] => (item=[u’alice’, u’employeedb’]) => {
“changed”: false,
“item”: [
“alice”,
“employeedb”
],
“msg”: “name=alice priv=employeedb”
}
ok: [192.168.10.11] => (item=[u’alice’, u’providerdb’]) => {
“changed”: false,
“item”: [
“alice”,
“providerdb”
],
“msg”: “name=alice priv=providerdb”
}
ok: [192.168.10.11] => (item=[u’bob’, u’clientdb’]) => {
“changed”: false,
“item”: [
“bob”,
“clientdb”
],
“msg”: “name=bob priv=clientdb”
}
ok: [192.168.10.11] => (item=[u’bob’, u’employeedb’]) => {
“changed”: false,
“item”: [
“bob”,
“employeedb”
],
“msg”: “name=bob priv=employeedb”
}
ok: [192.168.10.11] => (item=[u’bob’, u’providerdb’]) => {
“changed”: false,
“item”: [
“bob”,
“providerdb”
],
“msg”: “name=bob priv=providerdb”
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.11 : ok=1 changed=0 unreachable=0 failed=0


### 3.3 对哈希表使用循环



[root@hadoop1010 loops]# cat loopshash1.yaml

  • hosts: all
    gather_facts: False
    vars_files:

    • vars/user.yaml

    tasks:

    • name: Print phone records
      debug: msg=“User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})”
      with_dict: “{{users}}”

[root@hadoop1010 loops]# cat loopshash.yaml

  • hosts: all
    gather_facts: False
    tasks:
    • name: Print phone records
      debug: msg=“User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})”
      with_dict: “{{users}}”
      [root@hadoop1010 loops]# cat vars/user.yaml

  users:
    alice:
      name: Alice Appleworth
      telephone: 123-456-7890
    bob:
      name: Bob Bananarama
      telephone: 987-654-3210

执行效果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8ddb91288637472a96ef63fffc75c562.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4876e63b42574e7d98bd55fad9f039b0.png)


### 3.4 对文件列表使用循环


![在这里插入图片描述](https://img-blog.csdnimg.cn/0f5b87e073bf46fa9c4a7b8b40b212b3.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f43b4d7b8e3f4c00b4738e7a157d8fdf.png)


### 3.5 对并行数据集使用循环


假设你通过某种方式加载了以下变量数据:  
 alpha: [ ‘a’, ‘b’, ‘c’, ‘d’ ]  
 numbers: [ 1, 2, 3, 4 ]  
 如果你想得到’(a, 1)’和’(b, 2)’之类的集合.可以使用’with\_together’:



[root@hadoop1010 loops]# cat loopspral.yaml

  • hosts: all
    gather_facts: False
    vars_files:
    • vars/var1.yaml
      tasks:
    • debug: msg=“{{ item.0 }} and {{ item.1 }}”
      with_together:
      • “{{lpha}}”
      • “{{numbers}}”
        [root@hadoop1010 loops]# cat vars/var1.yaml

lpha: [ ‘a’, ‘b’, ‘c’, ‘d’ ]
numbers: [ 1, 2, 3, 4 ]


执行效果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6f41891d36ad4e768469a5bf431417de.png)


### 3.6 随机选择




  • hosts: all
    gather_facts: False
    tasks:
    • name: debug random choose
      debug: msg=“name ========> {{ item }}”
      with_random_choice:
      • hadoop1
      • ‘hadoop2’
      • ‘hadoop3’
      • ‘hello hadoop’

![在这里插入图片描述](https://img-blog.csdnimg.cn/7629f413d0c748769ba627106b129411.png)


### 3.7 条件判断


判断时间是否达到预计的时间,重试次数是5次,时间间隔是5s,如果达到预设值,任务执行成功,否则任务执行失败。



[root@hadoop1010 loops]# cat loopstiem.yaml

  • hosts: all
    gather_facts: False
    tasks:
    • name: debug loops
      shell: date ‘+%Y%m%d%H%M’
      register: time
      until: time.stdout.startswith(‘202303081709’)
      retries: 5
      delay: 5

执行成功:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4e0753f972624c26b0f67a33bfed9547.png)  
 执行失败:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4101125aa77a4f29b39b98ad972b52ca.png)


### 3.8 循环中使用注册器



[root@hadoop1010 loops]# cat loopsregister.yaml
#register loop

  • hosts: all
    gather_facts: True
    tasks:
    • name: debug loops register use
      shell: “{{ item }}”
      with_items:
      • ‘hostname’
      • ‘uname’
      • ‘date “+%Y%m%d”’
      • ‘uname -r’
      • ‘echo $JAVA_HOME’
        register: ret
    • name: display loops
      debug: msg=“{% for i in ret.results %} {{i.stdout}} {% endfor %}”

调测  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c81dae5dc1594420a851631fa4a63d41.png)  
 执行效果  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b37f15b086a44fe292267ebfc27d3a9f.png)


## 四、playbook的lookups


lookups插件是Jinja2模板语言的Ansible特定扩展。可以使用lookups插件从playbook中的外部源(文件、数据库、密钥/值存储、API和其他服务)访问数据。与所有模板一样,查找在Ansible控制机器上执行和评估。Ansible使用标准模板系统使查找插件返回的数据可用。可以使用查找插件从外部源加载包含信息的变量或模板。也可以创建自定义查找插件。


### 4.1 lookup files



[root@hadoop1010 lookups]# cat lookups1.yaml

  • hosts: all
    gather_facts: no

    tasks:

    • name: get file content with /tmp/test.txt
      set_fact:
      test: “{{ lookup(‘file’, ‘/etc/hostname’) }}”

    • name: register
      shell: cat /etc/hostname
      register: register_key

    • name: debug test and register_key
      debug:
      msg:
      - “{{ test }}”
      - “{{ register_key[‘stdout’] }}”
      [root@hadoop1010 lookups]# ansible-playbook lookups1.yaml

PLAY [all] **************************************************************************************************************************************************************************************

TASK [get file content with /tmp/test.txt] ******************************************************************************************************************************************************
ok: [192.168.10.11]
ok: [192.168.10.10]
ok: [192.168.10.12]

TASK [register] *********************************************************************************************************************************************************************************
changed: [192.168.10.10]
changed: [192.168.10.11]
changed: [192.168.10.12]

TASK [debug test and register_key] **************************************************************************************************************************************************************
ok: [192.168.10.11] => {
“msg”: [
“hadoop1010”,
“hadoop1011”
]
}
ok: [192.168.10.12] => {
“msg”: [
“hadoop1010”,
“hadoop1012”
]
}
ok: [192.168.10.10] => {
“msg”: [
“hadoop1010”,
“hadoop1010”
]
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.10 : ok=3 changed=1 unreachable=0 failed=0
192.168.10.11 : ok=3 changed=1 unreachable=0 failed=0
192.168.10.12 : ok=3 changed=1 unreachable=0 failed=0

[root@hadoop1010 lookups]#


### 4.2 lookup pipe



[root@hadoop1010 lookups]# cat lookupspip.yaml

  • hosts: all
    gather_facts: False
    tasks:
    • name: get contents
      set_fact:
      contents: “{{lookup(‘pipe’,‘date +%Y%m%d’)}}”
    • name: debug lookups
      debug:
      msg:
      - "The contents is {% for i in contents.split(‘\n’) %} {{ i }} {% endfor %} "
      [root@hadoop1010 lookups]# ansible-playbook lookupspip.yaml

PLAY [all] **************************************************************************************************************************************************************************************

TASK [get contents] *****************************************************************************************************************************************************************************
ok: [192.168.10.12]
ok: [192.168.10.11]
ok: [192.168.10.10]

TASK [debug lookups] ****************************************************************************************************************************************************************************
ok: [192.168.10.11] => {
“msg”: [
"The contents is 20230308 "
]
}
ok: [192.168.10.10] => {
“msg”: [
"The contents is 20230308 "
]
}
ok: [192.168.10.12] => {
“msg”: [
"The contents is 20230308 "
]
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.10 : ok=2 changed=0 unreachable=0 failed=0
192.168.10.11 : ok=2 changed=0 unreachable=0 failed=0
192.168.10.12 : ok=2 changed=0 unreachable=0 failed=0

[root@hadoop1010 lookups]#


### 4.3 lookup template



[root@hadoop1010 lookups]# cat lookupstemplate.yaml

  • hosts: all
    gather_facts: False
    tasks:
    • name: get contents
      set_fact:
      contents: “{{lookup(‘template’,‘./templates/test.j2’)}}”
    • name: debug lookups
      debug:
      msg:
      - “{% for i in contents.split(‘\n’) %} {{ i }} {% endfor %}”
      [root@hadoop1010 lookups]# ansible-playbook lookupstemplate.yaml

PLAY [all] **************************************************************************************************************************************************************************************

TASK [get contents] *****************************************************************************************************************************************************************************
ok: [192.168.10.10]
ok: [192.168.10.11]
ok: [192.168.10.12]

TASK [debug lookups] ****************************************************************************************************************************************************************************
ok: [192.168.10.10] => {
“msg”: [
" 12345 1234124 1241412 sadsf 123123 adasfsa 12312 asfasf "
]
}
ok: [192.168.10.11] => {
“msg”: [
" 12345 1234124 1241412 sadsf 123123 adasfsa 12312 asfasf "
]
}
ok: [192.168.10.12] => {
“msg”: [
" 12345 1234124 1241412 sadsf 123123 adasfsa 12312 asfasf "
]
}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.10.10 : ok=2 changed=0 unreachable=0 failed=0
192.168.10.11 : ok=2 changed=0 unreachable=0 failed=0
192.168.10.12 : ok=2 changed=0 unreachable=0 failed=0


## 五、playbook conditions



[root@hadoop1010 condition]# cat condition.yaml

  • hosts: all
    #gather_facts: False
    tasks:
    • name: Host 192.168.10.12 run this task
  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值