• Linux中级之ansible配置(playbook)


    一、playbooks

    如果用模块形式一般有幂等性,如果用shell或者command没有幂等性

    playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用

          tasks:一个task相当于是一个play

          varibles:变量,一定定义,多处调用

          template:模板,可以区分不同主机的特点

          handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers

    二、yaml介绍及格式

    yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。

    特点:

      (1)yaml的可读性好

      (2)yaml和脚本语言的交互性好

      (3)yaml使用实现语言的数据类型

      (4)yaml有一个一致的信息模型

      (5)yaml易于实现

      (6)yaml可以基于流程来处理

      (7)yaml表达能力强,扩展性好

    编写说明:

    (1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键

    (2)冒号:每个冒号后面一定要有一个空格

    注意:1. 以冒号结尾不需要空格

               2. 表示文件路径的模版可以不需要空格

    (3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

    注意:

      1. 严格控制空格编写剧本的时候

      2. 剧本编写不支持tab

    书写规范注意点:

      1、脚本名:***.yml   【不是.yml也行】

      2、注释:  “#”

      3、tasks: (后不能加任何字符-可以加注释#)

      4、- name: 一个 - name: 下不能有两条功能(行)

      .每个-和:即冒号之后要有一个空格,task除外。

    剧本格式:

      ---           ### 剧本的开头,可以不写

      - hosts: all     <- 处理所有服务器,找到所有服务器;  -(空格)hosts:(空格)all

      tasks:         <- 剧本所要干的事情;  (空格)(空格)task:

      - command:    (空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

      测试剧本命令后面可以跟多个-v进行调试检查

    常用命令:

    1、对剧本语法检测

      ansible-playbook --syntax-check  /root/ansible/httpd.yaml

    2、-C模拟执行剧本

      ansible-playbook  -C /root/ansible/httpd.yaml

    3、执行剧本

      ansible-playbook   /root/ansible/httpd.yaml

    三、ansible剧本实例

    实例一:基础(编写一个rehttpd.yaml剧本)

    第一步:编写剧本

    [root@ren5 ~]# vim rehttpd.yaml

    1 - hosts: test_ren1
    2   remote_user: root
    3   tasks:
    4   - name: copy httpd.conf
    5     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    6   - name: restart httpd
    7     service: name=httpd state=restarted

    第二步:语法检测

    [root@ren5 ~]# ansible-playbook --syntax-check rehttpd.yaml

    playbook: rehttpd.yaml

    第三步:模拟执行剧本

    [root@ren5 ~]# ansible-playbook -C rehttpd.yaml

    第四步:真正执行剧本

    [root@ren5 ~]# ansible-playbook rehttpd.yaml

    第五步:检查是否已经启动成功

    [root@ren5 ~]# ansible test_ren1 -m shell -a "ss -tnl |grep 80"

    实例二:打标签

    -t:执行指定tag标签任务

    --skip-tags:执行--skip-tags以外的任务

    执行:ansible-playbook xxx.yaml -t TAG

                 ansible-playbook xxx.yaml --skip-tags TAG

    定义带tag标签的yaml文件:

     1 - hosts: test_ren1
     2   remote_user: root
     3   tasks:
     4   - name: "touch 123.txt"
     5     shell: echo {{ ansible_all_ipv4_addresses }} > 123.txt
     6     tags:
     7     - tag1
     8   - name: "date"
     9     shell: date >> 123.txt
    10     tags:
    11     - tag2
    12     - tag3

    [root@ren5 ~]# ansible-playbook tag.yaml -t tag1             #只执行tag1标签的任务

    [root@ren5 ~]# ansible all -a "cat 123.txt"           #查看文件内容

    实例三:include

    include:如果有多个任务要执行,写在一个yaml文件里就显得太臃肿了,而且阅读性也比较低,这个时候可以用include关键字把多个任务联合到1个yaml文件里,方便调用

    比如有2个文件,a.yaml和b.yaml,那么我们可以把a.yaml,b.yaml联合到一个exec.yaml文件中执行

    a.yaml的内容如下:

    1 - name: "touch abc.txt"
    2   shell: echo 'hello' >> abc.txt

    b.yaml的内容如下:

    1 - name: "touch abc.txt"
    2   shell: echo 'world' >> abc.txt

    exec.yaml的内容如下:

    1 - hosts: test_ren1
    2   remote_user: root
    3   tasks:
    4   - include_tasks: a.yaml
    5   - include_tasks: b.yaml

    [root@ren5 ~]# ansible-playbook --syntax-check exec.yaml

    [root@ren5 ~]# ansible-playbook exec.yaml

    [root@ren5 ~]# ansible test_ren1 -m shell -a "cat abc.txt"

    实例四:剧本中使用变量

    变量的引用:{{变量名}}

      一、自定义变量的实现方式:

    第一种:直接写在yaml文件中,在文件中声明变量(声明变量只需要声明1次,定义变量可以定义多次)

          vars和tasks同级,并要写在tasks前面

          vars:

    - 变量名: 变量值

    vars:

    - file: httpd.conf         #file就是一个变量

    1 - hosts: 192.168.11.4
    2   remote_user: root
    3   vars:
    4   - packages: tree
    5   tasks:
    6   - name: yum install tree
    7     yum: name={{ packages }} state=present

    第二种:在inventory file文件中定义

          vim /etc/ansible/hosts    #定义主机组

                 [test_ren1:vars]

                 file=httpd.conf    #变量名=变量值

                 packages=tree             #file和packages是两个变量

    第三种:执行playbook文件候给与变量 --extra-vars

          ansible-playbook test.yaml --extra-vars "touch_file=test.txt"  #--extra-vars可以出现一次或者多次

      二、注册变量

      register注册变量:把date命令输出的结果赋予给date_output

    1 - hosts: 192.168.254.10
    2   remote_user: root
    3   tasks:
    4   - name: get date
    5     command: date
    6     register: date_output
    7   - name: echo date_output
    8     shell: "echo {{date_output.stdout}}>/tmp/a.txt"
    1 ---
    2 - hosts: test1
    3   remote_user: root
    4   tasks:
    5   - name: get users_info
    6     command: "tail /etc/passwd"
    7     register: users_info    
    8   - name: echo users_info
    9     shell: "echo '{{ users_info.stdout }}' > /root/ab.txt"    
        #若变量值(变量内容)包含较多内容时,需用引号引起来

    实例五、剧本中使用判断

    剧本中可以使用when来进行判断

    when条件语句:可以根据setup显示出客户端信息为依据来判断

    1、根据系统信息判断

    1 ---
    2 - hosts: test_ren1
    3   remote_user: root
    4   tasks:
    5   - name: touch file
    6     shell: "touch /tmp/a.txt"
    7     when: ansible_distribution=='CentOS' and ansible_distribution_major_version=='8'

    2、根据域名判断

    第一步:查看主机的域名(ansible_fqdn是一个变量)

    [root@ren5 ~]# ansible 192.168.11.4 -m setup |grep ansible_fqdn

            "ansible_fqdn": "ren4",

    第二步:编写剧本

    在编写剧本的时候ren4即主机名需要加上双引号或者单引号,否则会报错

    1 ---
    2 - hosts: all
    3   tasks:
    4   - name: useradd liqin
    5     user: name=liqin uid=1210 system=yes
    6     when: ansible_fqdn == "ren4"

    第三步:语法检测

    [root@ren5 ~]# ansible-playbook --syntax-check name.yaml

    第四步:模拟执行

    [root@ren5 ~]# ansible-playbook -C name.yaml

    实例六:剧本中使用循环(迭代)

    剧本中的循环使用with_items,使用item引用变量(item不可变)

    变量的引用格式是 {{ item }}

    第一种:

     1 ---
     2 - hosts: 192.168.11.6
     3   remote_user: root
     4   tasks:
     5   - name: add many users
     6     user: name={{ item }} state=present
     7     with_items:
     8     - user01
     9     - user02
    10     - uesr11
    11     - user12

    第二种:Key-Value,键值对的形式实现了传多个变量的需求

    1 ---
    2 - hosts: 192.168.11.6
    3   remote_user: root
    4   tasks:
    5   - name: add many users
    6     user: name={{ item.name }} groups={{ item.groups }} state=present
    7     with_items:
    8     - { name: 'testuser1', groups: 'root' }
    9     - { name: 'testuser2', groups: 'ren6' }

    实例七:异常处理

    ignore_errors:如果任务出错,直接跳过,不会影响其他任务

    1 ---
    2 - hosts: 192.168.11.4
    3   remote_user: root
    4   tasks:
    5   - name: error
    6     command: make a.txt
    7     ignore_errors: yes

    实例八:使用处理器(触发器)notify

    handlers:如果执行的任务被改变那么会触发handlers的任务,notify下面的 - 引导的列表可以为一个或者多个,类似于流程控制语句

    剧本说明:

    - hosts: all 指定主机组,可以理解为这个最大,顶个写

      tasks: 指定下面一系列的动作,这个是第二,需要有两个空格

        - name: 指定名称,排行第三,需要有三到四个空格

          yum: 模块名 排行第四,需要有四到五个空格

       notify:

          - name: 和handlers下面的name名称对应

      handlers:指定处理器(触发器),排行第二,需要与tasks对齐,必须写在最后

     1 ---
     2 - hosts: test_ren1
     3   remote_user: root
     4   tasks:
     5   - name: copy httpd.conf
     6     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
     7     notify:
     8     - restarted httpd service
     9   handlers:
    10   - name: restarted httpd service
    11     service: name=httpd state=restarted

    执行过程中间有一步RUNNING HANDLER,说明已经触发了处理器进行了重启操作

     1 ---
     2 - hosts: test1
     3   remote_user: root
     4   tasks:
     5   - name: get users_info
     6     command: "tail /etc/passwd"
     7     register: users_info
     8     notify:    #执行多次获报错,可使用触发器或者ignore_errors
     9     - echo users_info
    10   handlers:
    11   - name: echo users_info
    12     shell: "echo '{{ users_info.stdout }}' > /root/a.txt"

    实例九:模板拷贝(templates)

    template,用来区分不同客户端上的特性

    1.copy模块替换成template(template本身就有copy的作用,也可以识别变量)

      vim test.yaml

     1 ---
     2 - hosts: test1
     3   remote_user: root
     4   tasks:
     5   - name: copy httpd.conf
     6     template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
     7     notify:
     8     - restarted httpd service
     9   handlers:
    10   - name: restarted httpd service
    11     service: name=httpd state=restarted

    2.vim httpd.conf编辑要拷贝的文件,把不同的地方定义成变量形式{{变量名}}

      vim /etc/httpd/conf/httpd.conf

    1 42 Listen {{ port }}

    3.vim /etc/ansible/hosts 在主机后面定义变量的值:变量名=变量值

    1 [test1]
    2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=81
    3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=82

      ansible-playbook test.yaml,执行后查看结果

    [root@ren6 ~]# ansible all -m shell -a "ss -tnl"
    192.168.11.4 | CHANGED | rc=0 >>
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128          *:22                       *:*                  
    LISTEN     0      100    127.0.0.1:25                       *:*                  
    LISTEN     0      128         :::82                      :::*                  
    LISTEN     0      128         :::22                      :::*                  
    LISTEN     0      100        ::1:25                      :::*                  
    
    192.168.11.5 | CHANGED | rc=0 >>
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128          *:22                       *:*                  
    LISTEN     0      100    127.0.0.1:25                       *:*                  
    LISTEN     0      128         :::81                      :::*                  
    LISTEN     0      128         :::22                      :::*                  
    LISTEN     0      100        ::1:25                      :::*                  
  • 相关阅读:
    Linux云服务器卡顿排查过程
    Linux系统磁盘分区格式MBR格式转换GPT
    云主机新增网卡配置多网卡策略路由
    RHEL8/CentOS8的网络网卡配置&常用命令详解
    Python三方库:Pika(RabbitMQ基础使用)
    Python内置库:unittest.mock(单元测试mock的基础使用)
    Python内置库:wsgiref(WSGI基础)
    Python内置库:array(简单数组)
    Python内置库:concurrent.confutures(简单异步执行)
    ubuntu18.04安装激活pycharm以及配置pycharm的环境变量
  • 原文地址:https://www.cnblogs.com/renyz/p/11403623.html
Copyright © 2020-2023  润新知