Ansible_yaml剧本

YAML语法
YAML最初是Yet Another Markup Language(另一种标记语言)的缩写,后来为了强调yaml是以数
据为中心重新命名为递归写法YAML Ain’t
Markup Language(YAML 不是一种标记语言)。

散列表:(又叫哈希表),有键值对组成。
    示例:
        name: aaa
        age: 12
        或者
        {name: aaa, age: 12}
列表:
    示例:
        - list1
        - list2
        - list3
        或者
        [list1, list2, list3]
散列表中是引用列表:
    示例:
        name:
            - name1
            - name2
列表中使用散列项:
    示例:
        - name: aaa
          age: 18
        或者
        - {name: aaa, age: 18}
列表中使用列表项:
    示例:
        - [name, age, ]
        或者
        -
          - name1
          - name2
散列表中使用散列表:
    示例:
        names1:
            name1: aaa
            name2: bbb
            name3: ccc
        names2:
            .....: ..
            .....: ..
playbook组成结构:
        Inventory
        Modules
        Ad Hoc Command
        hosts
        Playbook
            Task:任务,即调用模块完成的某操作
            Variables:变量
            Templates:模板
            Handlers:处理器,由某事件触发执行的操作
            Roles:角色
示例:
- hosts: webnodes   # hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组
  vars:
    http_port: 80
    max_clients: 256
  remote_user: root # remote_user则用于指定远程主机上的执行任务的用户。remote_user也可用于各task中
  tasks:    # 任务列表task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成
              第一个任务后再开始第二个如果中途发生错误,所有已执行任务都有可能将回滚
  - name: ensure apache is at the latest version    # 在众多模块中,只有command和shell模块仅需要给定
  一个列表而无需使用“key=value
                                                      command: /sbin/setenforce 0
    yum: name=httpd state=latest
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

运行playbook的方式:
    (1) 测试
        ansible-playbook  --check
            只检测可能会发生的改变,但不真正执行操作;
        ansible-playbook  --list-hosts
            列出运行任务的主机;
        ansible-playbook  --list-tasks
            列出要运行的任务列表
        ansible-playbook --syntax-check 
            语法检查
handlers:
       任务,在特定条件下触发;
       接收到其它任务的通知时被触发;
           notify: HANDLER TASK NAME

条件式触发器

- hosts: web
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: db
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    notify: restart redis service   # 引用触发器
    tags: instconf
  - name: start redis service
    service: name=redis enabled=true state=started
    tags: startredis
  handlers: # 定义触发器
  - name: restart redis service
    service: name=redis state=restarted
# 给play添加tags
- hosts: web
  remote_user: root
  tags: nginx service   # play添加标签
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: db
  remote_user: root
  tags: redis service   # play添加标签
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    notify: restart redis service
    tags: instconf
  - name: start redis service
    service: name=redis enabled=true state=started
    tags: startredis
  handlers:
  - name: restart redis service
    service: name=redis state=restarted


{default,file,handlers,meta,tasks,templates,vars}
例子:在webserver上面安装nginx,在dbserver上面安装redis,并且redis每次修改配置
文件后,会触发重启redis服务。

打上标签后,可以只单独运行标签的那一部分
[ root@node1 ~ ]# ansible-playbook -t install nginx.yaml 


- hosts: webserver
  remote_user: root
  tasks:                                #任务
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: dbserver
  remote_user: root
  tasks:                                
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: install
    notify: restart redis service       #触发器,配置文件修改后会触发后面的handlers
  - name: start redis service
    service: name=redis state=started
    tags: startredis                    #使用标签
  handlers:                             #不主动使用,只能被前面触发.
  - name: restart redis service
    service: name=redis state=restarted

变量
(1) facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;

(2) 用户自定义变量:

(a) ansible-playbook命令的命令行中的
    -e VARS, --extra-vars=VARS
    # 示例:ansible-playbook test.yml --extra-vars "name=nginx user=root"  
    Note:命令行的变量比playbook中的变量优先级高。
(b) 在playbook中定义变量的方法:
    vars:
    - var1: value1
    - var2: value2
变量引用:{{ variable }}

例子:

[ root@node1 ~ ]# cat installpkc.yml 
- hosts: webserver
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package {{ pkgname }}
    yum: name={{ pkgname }} state=latest
[ root@node1 ~ ]# ansible-playbook -e "pkgname=memcached" -C installpkc.yml    #这里在命令行定义变量

PLAY [webserver] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [172.18.25.52]
ok: [172.18.25.51]

TASK [install package memcached] ***********************************************
changed: [172.18.25.51]
changed: [172.18.25.52]

(3) 通过roles传递变量;

(4) Host Inventory #主机清单
Note:变量优先级低
(a) 用户自定义变量

(i) 向不同的主机传递不同的变量;
                IP|HOSTNAME  varaiable=value var2=value2
例子:
[webserver]
172.18.25.51 pkgname=redis
172.18.25.52 pkgname=memcached

(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value

例子:
    [webserver]
    172.18.25.51
    172.18.25.52

    [webserver:vars]
    pkgname=redis

(b) invertory参数
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;

    ansible_ssh_host
    ansible_ssh_port
    ansible_ssh_user
    ansible_ssh_pass
    ansbile_sudo_pass
    ...

例子:一种不基于密钥的连接方法,不推荐使用。

    [webserver]
    172.18.25.51 ansible_ssh_user=root  ansible_ssh_pass=123
    172.18.25.52 ansible_ssh_user=root 
    ansible_ssh_pass=centos
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值