Linux 命令 Ansible-playbook


原文链接: Linux 命令 Ansible-playbook

使用

ansible-playbook -i inventory.ini xxx.yml -k -K
-i 指定主机
-e 设置运行变量
-k 执行之后需要输入 ssh 连接用户的密码,如果做了中控机到所有节点的互信,则不需要此参数
-K 执行之后需要输入 sudo 所需的密码,如果使用 root 用户或者 sudo 无需密码,则不需要此参数
-   name: create user
    hosts: all
    user: root
    gather_facts: false
    vars:
        - user: "test"
    tasks:
        - name: create user
         user: name="{{ user }}"
        - name: remove user
         user: name="{{ user }}" state=absent
    - debug:
    msg: "System \{\{ inventory_hostname \}\} has gateway \{\{ ansible_default_ipv4.gateway \}\}"

role 中使用变量

---
- hosts: default
  roles:
  - role: ansible-elastic-centos
    elastic_name: elasticsearch
    elastic_enabled: yes
    elastic_state: started
    elastic_version: 5.3.0
    elastic_java: java-1.8.0-openjdk
    become: yes

nsq 在role中使用变量

ansible-galaxy install ernestas-poskus.ansible-nsq

- name: Installing NSQ
  hosts: nsqs
  sudo: yes
  roles:
    - role: ernestas-poskus.ansible-nsq
      nsq_lookupd_tcp_addresses: "{{ groups['nsqs']|map('extract', hostvars, ['ansible_eth1', 'ipv4', 'address'])|list }}"
      nsq_lookupd_http_addresses: "{{ groups['nsqs']|map('extract', hostvars, ['ansible_eth1', 'ipv4', 'address'])|list }}"

extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\1:2379') | list }}"

时间同步 chrony

ansible-galaxy install influxdata.chrony

mariadb 集群

  1. ansible-galaxy install mrlesmithjr.mariadb-galera-cluster mrlesmithjr.etc-hosts
  2. /etc/ansible/roles/mrlesmithjr.mariadb-galera-cluster

3. Playbook

-i 指定 host Inventory
-e 通过命令行设置变量
### Playbook 中定义的变量

用户可以在 Playbook 中,通过 vars 关键字自定义变量,使用时用 {{ }} 引用以来即可。
Playbook 中定义和使用的变量的方法

例如下面的例子中,用户定义变量名为 http_port,其值为为 80。在 tasks firewalld 中,通过 {{ http_port }} 引用。


  • hosts: web
    vars:
    http_port: 80
    remote_user: root
    tasks:
    • name: insert firewalld rule for httpd
      firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes

把变量放在单独的文件中

当变量比较多的时候,或者变量需要在多个 playbook 中重用的时候,可以把变量放到一个单独的文件中。通过关键字 var_files 把文件中定义的变量引入 playbook 中,使用变量的方法和在本文件中定义的变量相同。

- hosts: web
  remote_user: root
  vars_files:
      - vars/server_vars.yml
  tasks:
  - name: insert firewalld rule for httpd
    firewalld: port=\{\{ http_port \}\}/tcp permanent=true state=enabled immediate=yes

变量文件 vars/server_vars.yml 的内容为:

http_port: 80

### Playbook 通过命令行使用变量 -e

ansible-playbook main.yml -e "hosts=web user=root"
ansible-playbook main.yml -e "{'hosts':'vm-rhel7-1','user':'root'}" # json 传递参数
ansible-playbook main.yml -e "@vars.json" #文件传参

Playbook 变量覆盖

http://docs.ansible.com/ansible/latest/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

1.  role defaults[1]          
2.  inventory 文件或脚本组 vars [2]
    playbook group_vars / *
    inventory 文件或脚本主机 vars [2]
    inventory host_vars / *
    playbook host_vars / *
    host facts        
    role vars(在 `role/vars/main.yml` 中定义)
    include_vars
    set_facts / registered vars
    --extra-vars (命令行中 -e 指定优先级最高)

基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。 )

基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。

`