ansible的yaml文件,循环引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible的yaml文件,循环引用相关的知识,希望对你有一定的参考价值。

1、vars.yaml文件如下:
---
servers:
- server1:
- ip: 192.168.1.10

src_file: /usr/local/src1.txt
dest_file: /usr/local/dest1.txt
- server2:
- ip: 192.168.1.11

src_file: /usr/local/src2.txt
dest_file: /usr/local/dest2.txt

2、copy.yaml文件如下:
---
- hosts: server.item.ip
- tasks:
name: update file
template: src= server.item.src_file dest= server.item.dest_file
with_items:
- vars_files: vars.xml

请教各位大神:
我能不能用类似with_items这种方式,遍历上面的vars.xml文件,批量更新文件?

参考技术A 在- hosts: cluster的host:后面如果有一个空格就会指向下一行,如果没有空格就是指向别的行,代码完全重写手打过几遍或者直接复制例子代码都会报错。我看了一下yaml语法,感觉remote_user: root前面应该加缩进。不好意思。放假确认晚了。我是这样写的。但是错误就会出现在tasks那一行

playbook 介绍

1、什么是playbook

  • 将多个要执行ansible操作安装顺序整合到一个文件中,
  • 这个文件就是yaml 执行yaml文件的方法是通过ansible-playbook执行

yaml文件中的元素

  • 变量
  • 循环
  • 判断

2、变量

变量命名规则

  • 只能以字母为开头
  • 构成只能有数字、字母、下划线

变量类别

  • 自定义
  • 内置变量

获取内置变量

ansible all -m setup

执行a.yaml,同时传递变量name=tom,age=20  

# ansible-playbook a.yaml --extra-vars "name=tom, age=20"  

案例:安装httpd,要求设置apache的端口为808,网站跟目录/myweb

- host: all                     # 指定要操作的主机组
  remoute_user: root            # 指定在远程主机上以哪个用户身份执行tasks
  vars:                         # 定义变量
  - port: 808                   # 变量名、变量值
  - root: /myweb                # 变量名、变量值
  tasks:                        # 指定要执行的操作列表
  - name: install httpd                # 设置一个名称,用于给用户提示正在执行操作
    yum: name=httpd state=latest       # yum是模块名,后面是参数
  - name: start httpd              
    service: name=httpd state=started  # service是模块名,后面的参数

 注意:playbook对格式缩进要求十分严格。 

yaml 文件中的主要构成

  • host  主机组
  • tasks   要执行的操作列表
  • vars  定义变量
  • remote_user  在远程主机上以什么用户执行

3、触发器

  • 让一个task在特定的情况下才会被执行

 案例:在所有被管理节点安装httpd,然后启动httpd,要求httpd启动端口是8080

- hosts: all
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd state=present 
  - name: start httpd
    service: name=httpd state=started enabled=true
  - name: send httpd.conf
    copy: src=/root/httpd.conf.template dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

 

4、yaml使用变量

 (1)自定义变量

- hosts: all
  remote_user: root
  vars:
  - package_name: mysql-server     # mariadb-server
  - service_name: mysqld           # mariadb
  tasks:
  - name: install mysql server
    yum: name={{ package_name }} state=latest
  - name: start mysql server
    service: name={{ service_name }} state=started

 (2)使用ansible的内置变

在每个被管理主机上创建一个用户,用户名和主机名相同

在每个被管理主机上创建一个和主机同名的目录

 查询内置变量
[root@centos6-1 ~]# ansible all -m setup | grep fqdn
        "ansible_fqdn": "centos6-2", 
[root@centos6-1 ~]# cat c.yaml
- hosts: all
  tasks:
  - name: create user
    user: name={{ ansible_fqdn }} state=present
  - name: create file
    file: name=/tmp/{{ ansible_fqdn }} state=touch

(3)主机清单变量

# 定义主机变量
[webservers]
192.168.31.64 userid=1050
192.168.31.66 userid=1060

# 定义主机组变量
[webservers:vars]
username=jerry
- hosts: all tasks: - name: create user user: name={{ username }} uid={{ userid }} state=present

 

5、template

  • template称为模板

  • 模板的用处是用来动态生成服务的配置文件

- hosts: all
  tasks:
  - name: delete old epel repo file
    shell: rm -rf /etc/yum.repos.d/epel*
  - name: create new epel repo file
    shell: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
  - name: install nginx
    yum: name=nginx state=latest
  - name: send nginx.conf
    template: src=/root/template.j2 dest=/etc/nginx/nginx.conf
    notify:
    - restart nginx
  - name: start nginx
    service: name=nginx state=started enabled=true
  handlers:
  - name: restart nginx
    service: name=nginx state=restarted

  

6.判断

  • 格式 :when
  • 作用:判断满足条件,才执行操作

案例:用playbook实现如下功能

1:在所有被管理主机上安装zsh

2:在主机名为centos7-2的主机上创建用户tom3,其他主机不创建

- hosts: all
  tasks:
  - name: install zsh
    yum: name=zsh state=present
  - name: create user tom3
    user: name=tom3 state=present
    when: ansible_fqdn == "centos7-5"

7.判断 

  • 内置变量:item
  • 循环格式:with_items 列表

 

案例:在所有被管理主机上创建5个用户u1 u2 u3 u4 u5

- hosts: all
  tasks:
  - name: create user
    user: name={{ item }} state=present
    with_items:
    - u1
    - u2
    - u3
    - u4
    - u5

8 tags  

 作用:给某个task设置一个表情,用于仅仅执行某个task

- hosts: all
  tasks:
  - name: isntall
    shell: yum install httpd -y
  - name: send file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
    tags:
    - senfile
  - name: start httpd
    shell: systemctl start httpd
  handlers:
  - name: restart httpd
    shell: systemctl restart httpd
 [root@centos7-1 ~]# ansible-playbook 4.yaml --tags="senfile"

  

 

 

以上是关于ansible的yaml文件,循环引用的主要内容,如果未能解决你的问题,请参考以下文章

1. ansible-playbook 变量定义与引用

ansible 变量定义和引用

playbook 介绍

单独文件中的 FastAPI / Pydantic 循环引用

ansible核心模块playbook介绍

ansible-playbook模板化(jinja2)