/article/2017/06/01/ansible-use-201706111015/

ansible配置和使用

  • 【作者】看不见我
  • 【分类】Linux
  • 【发布】2017-06-01 22:46
  • 【更新】2018-11-17 10:26

ansible use

  • 官方文档: https://docs.ansible.com/
  • 中文文档: http://www.ansible.com.cn/

配置文件

应用程序的主配置文件

Ansible的一些的设置可以通过配置文件完成.

用户可以修改一下配置文件来修改设置,他们的被读取的顺序如下:

  • ANSIBLE_CONFIG (一个环境变量)
  • ansible.cfg (位于当前目录中)
  • .ansible.cfg (位于家目录中)
  • /etc/ansible/ansible.cfg (默认全局配置文件)

配置形式(ini格式):

[defaults]
host_key_checking = False
[ssh_connection]
scp_if_ssh = smart

配置参考:http://www.ansible.com.cn/docs/intro_configuration.html

Host Inventory(定义管控主机)

参考:http://www.ansible.com.cn/docs/intro_inventory.html

Inventory文件,用于配置节点信息,使用ansible时, 指定Patterns,根据Inventory配置来操作远程机器。

单独使用Inventory配置文件

默认配置文件: /etc/ansible/hosts

# 未分组
mail.example.com
badwolf.example.com:5309

[dbservers]
one.example.com
two.example.com

[webservers]
www[01:50].example.com

# 以下方式单独设置主机变量,这些变量定义后可在playbooks中使用
[targets]
localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_ssh_user=mpdehaan
other2.example.com     ansible_connection=ssh        ansible_ssh_user=mdehaan
host1 http_port=80 maxRequestsPerChild=808

# 也可以定义属于整个组的变量
[databases]
db-[a:f].example.com
[databases:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

# 可以把一个组作为另一个组的子成员,以及分配变量给整个组使用.
# 这些变量可以给ansible-playbook使用,但不能给ansible使用
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast

可以手动指定Inventory配置文件:

ansible -i /PATH/TO/HOSTS_File HOST-Patterns -m MODULE_Name -a "ARGS..."

ansible -i /tmp/myhosts.file all -m ping

分文件定义Host和Group变量来配置Inventory

在inventory主文件中保存所有的变量并不是最佳的方式. 还可以保存在独立的文件中,这些独立文件与inventory文件保持关联. 不同于inventory文件(INI格式),这些独立文件的格式为YAML.

对主机的配置存放在host_vars/目录下。
对组的配置存放在group_vars/目录下。

/etc/ansible/hosts
/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

group_vars/和host_vars/目录可放在inventory目录下,或是playbook目录下. 如果两个目录下都存在,那么playbook目录下的配置会覆盖inventory目录的配置.

Patterns语法

Patterns用法参考:http://www.ansible.com.cn/docs/intro_patterns.html

# 支持通配,支持域名
all
*
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*

# group组
webservers
webservers[0]
webservers[0-25]

# 多个组,相当于或集
webservers:dbservers
# 排除其他组!,非集
webservers:!phoenix
# 主机必须同时存在组,并集
webservers:&staging
webservers:dbservers:&staging:!phoenix

# 正则
~(web|db).*\.example\.com

ansible使用

Ansible提供两种方式去完成任务,一是ad-hoc命令,一是写Ansible playbook. 前者可以解决一些简单的任务, 后者解决较复杂的任务.

  • 使用ad-hoc,既使用/usr/bin/ansible这个命令的意思。
  • 使用playbook,既使用/usr/bin/ansible-playbook这个命令的意思。

比如说因为圣诞节要来了,想要把所有实验室的电源关闭,我们只需要执行一行命令就可以达成这个任务, 而不需要写playbook来做这个任务.至于说做配置管理或部署这种事,还是要借助 playbook 来完成, 即使用 ‘/usr/bin/ansible-playbook’ 这个命令.

使用ansible推荐通讯方式:

  • 通讯方式使用ssh,sftp,scp,及基于ssh的分通讯方式
  • 使用ssh启用启用公钥认证方式
  • 使用ssh-agent管理私钥

使用Ad-Hoc管理简单任务

参考:http://www.ansible.com.cn/docs/intro_adhoc.html

# 最常使用命令
ansible [-i host-file] <host-pattern> [-f forks] [-m module_name] [-a args]
  -i host-file     指定host-file替代/etc/ansible/hosts
  host-pattern     指定Patterns参数,匹配需要执行操作的host
  -f forks         指明每批管控forks数量的主机,默认为5个主机一批次
  -m module_name   使用何种模块管理操作,所有的操作都需要通过模块来指定,默认command
  -a args          指明模块专用参数。args一般为key=value格式;
                   而command模块的参数非为kv格式,而是直接给出要执行的命令即可。
  -u remote_user   指定登录的用户名
  --private-key=PRIVATE_KEY_FILE
                   指定秘钥文件
  -s, --sudo       使用sudo执行命令

  -v, -vvvv        显式详细信息(v可以1-4个)
  -C, --check      测试ansible执行,但是命令不会真正执行
  --list-hosts     不执行命令,输出匹配的机器host

使用Playbook管理复杂任务

  • 官方文档: https://docs.ansible.com/ansible/latest/user_guide/playbooks.html
  • 中文文档: http://www.ansible.com.cn/docs/playbooks.html

对于需反复执行的、较为复杂的任务,可以通过定义Playbook来搞定。 Playbook是Ansible真正强大的地方,它允许使用变量、条件、循环、以及模板, 也能通过角色及包含指令来重用既有内容。

该例子在远端机器上创建一个新的用户:

user.yml

---
- hosts: all
  become: yes
  become_method: sudo
  tasks:
    - name: "检查参数 absdir"
      fail: msg="需要提供变量 absdir(目录绝对路径)"
      when: absdir is undefined
    - name: "检查参数 group"
      fail: msg="需要提供变量 group(共享的group名称)"
      when: group is undefined
    - name: "设置 {{ absdir }} 的权限为 root.{{ group }} 2775"
      file:
        path: "{{ absdir }}"
        owner: root
        group: "{{ group }}"
        mode: u=rwx,g=rwxs,o=rx

要执行Playbook,可以敲入:

ansible-playbook user.yml

常用的ansible-playbook命令选项

ansible-playbook [options] playbook.yml [playbook2 ...]
  -i host-file     指定host-file替代/etc/ansible/hosts
  -l 'SUBSET', --limit 'SUBSET'
                   指定Patterns参数,匹配需要执行操作的host
  -f forks         指明每批管控forks数量的主机,默认为5个主机一批次
  -u remote_user   指定登录的用户名
  --private-key=PRIVATE_KEY_FILE
                   指定秘钥文件
  -s, --sudo       使用sudo执行命令
  -e EXTRA_VARS    添加变量,可以是 key=value 或 YAML/JSON 或 @filename

  -C, --check      测试ansible执行,但是命令不会真正执行
  -v, -vvvv        显式详细信息(v可以1-4个)
  --list-hosts     不执行命令,输出匹配的机器host
  --list-tags      list all available tags
  --list-tasks     list all tasks that would be executed
Top