コントロールされる側に以下のパッケージが必要。
python-simplejson
yum install python27-devel pip-2.7 install ansible
yum install ansible --enablerepo=epel
yum install python-pip.noarch yum install python-devel.x86_64 pip install PyCrypto==2.3 pip install ansible
easy_install-2.7 pip pip2.7 install ansible
http://server-setting.info/blog/sshpass-cygwin-autologin.html#sshpass_1
ansible.cfgファイルの探す順番は以下の通り。
カレントにおいておけばそこが一番に読み込まれる。以下のように記載しておけば-iでインベントリを指定しなくてよい。
[defaults] hostfile = hosts
# local localhost ansible_connection=local # SSHポート 10022でユーザーはremote_user remote.example.com ansible_ssh_port=10022 ansible_ssh_user=remote_user ansible_ssh_private_key_file=~/.ssh/KEY_FILE ansible_ssh_host=192.168.1.50
クラウド向けにはDynamic Inventoryという概念がある。詳細は公式HPで収集せよ。
ansible_ssh_host | ホスト名に対しての実IP |
ansible_ssh_port | SSHポート |
ansible_ssh_user | SSHユーザ |
ansible_ssh_pass | SSHパスワード。べた書きは非推奨なので--ask-passオプションを付けて実施するか公開鍵認証推奨 |
ansible_sudo | sudoを使うかどうか。デフォルトはfalse |
ansible_sudo_pass | sudo のパスワード。危険なので--ask-sudo-passオプションを推奨) |
ansible_sudo_exe (new in version 1.8) | sudo コマンドへのパス |
ansible_connection | local, ssh or paramiko. |
ansible_ssh_private_key_file | 秘密鍵ファイルの場所 |
ansible_shell_type | シェル |
ansible_python_interpreter | ログイン側のpython |
ansible\_\*\_interpreter | ansibleのインタープリタの場所 |
hoge: value hogearray: - one - two - three
ansible web03 -a "ls" -i hosts | ls |
ansible web03 -a "ls" -i hosts --ask-pass | ls |
ansible web03 -m copy -a "src=/etc/hosts dest=/tmp/hosts" -i host | 操作元ホストからリモートホストへファイルコピー |
ansible-playbook -i hosts simple-playbook.yml --syntax-check
ansible-playbook -i hosts simple-playbook.yml --list-tasks
ansible-playbook -i hosts simple-playbook.yml -C
TOP -vars -roles hosts
- hosts: all user: hoge tasks: - script: /home/hoge/test.sh
--- - include: setup-web.yml when: type == "WEB" - include: setup-db.yml when: type== "DB"
- name: yum install yum: name={{ item }} with_items: - httpd - php
- hosts: web03 user: ec2-user tasks: - name: Install httpd yum: name=httpd state=latest sudo: yes - name: apacheが起動していることを確認 action: service name=httpd state=started sudo: yes - name: "設定の修正(1)" lineinfile: >- dest='/etc/httpd/conf/httpd.conf' state=present backrefs=yes regexp='^#?\s*ServerTokens' line='ServerTokens Prod' sudo: yes notify: apache restart - name: Install openJDK yum: name=java-1.8.0-openjdk-devel state=latest sudo: yes handlers: - name: apache restart service: name=httpd state=restarted sudo: yes
ansible-playbook -i hosts tcp_wrapper.yml --tags "security"
- hosts: web03 user: ec2-user tasks: - name: deny all service lineinfile: >- dest='/etc/hosts.deny' state=present line='ALL: ALL' sudo: yes tags: - security - name: enable ssh for limited ip lineinfile: >- dest='/etc/hosts.allow' state=present line='sshd: 172.20.128.' tags: - security - othertag sudo: yes
python -c 'import crypt; print crypt.crypt("YOURPASSWORD", "$1$SomeSalt$")'
- hosts: web03 user: ec2-user vars: user_name: normaluser user_pass: '$6$P0ky3YE5$JNFD0EuY52rXeVtNVypSMkB3chjHWu9z3o.8KMANeblkEe8p7ZOD0HSuPGT0pbzgHW2kP.xo4zE17tM6wy.1Y1' tasks: - name: Add a new user user: name={{user_name}} password={{user_pass}} groups=wheel state=present sudo: yes
- hosts: web03 user: ec2-user tasks: - name: touch shell: touch /var/tmp/{{ item.path }} with_items: - { path: 'hoge' } - { path: 'fuga' } - name: result test shell: echo "hoge" register: result failed_when: result.rc not in [0, 1] - name: catしたものをcontents変数に入れる shell: cat /etc/passwd register: contents - name: contents変数の標準出力にrootが含まれるときは実施 shell: ls when: contents.stdout.find('root') != -1 - name: 日付変数を作成してそのファイルを作る shell: date +'%Y%M%d%I%M%S' register: datestring - name: 日付のフォルダ作成 shell: touch /var/tmp/{{ datestring.stdout }} - name: symlink作成 file: src=/var/tmp/{{ datestring.stdout }} dest=/var/tmp/latest state=link
- name: setup authorized_key authorized_key: user=user1 key="{{ item }}" with_file: - id_rsa.pub
- name: 古いディレクトリを特定する。 shell: ls -t1 | tail -n +5 args: chdir: /var/tmp register: old_dirs - name: 古いディレクトリ削除 file: path={{ item }} with_items: old_dirs.stdout_lines
- name: jenkins exists check stat: path=/var/cache/ansible/jenkins.war register: jenkins - name: Jenkinsをダウンロードする get_url: url: http://mirrors.jenkins-ci.org/war/latest/jenkins.war dest: /var/cache/ansible/ when: jenkins.stat.exists == False
ec2 | Amazon ec2 | boto required for this moduleとでたら、pip install boto |
s3 | Amazon s3 |
shell | シェルを実行だが、コマンドも実行できる |
-name: debug debug: var=p
リモート側にMySQL-pythonモジュールが必要。場合によってはyumではなくpipで入れないと認識しないので注意。
- name: MySQL DB 設定 mysql_db: name=DB_NAME state=present - name: MySQL user hoge 追加(ローカル限定のユーザ) mysql_user: name=hoge password=hoge priv=DB_NAME.*:ALL state=present - name: MySQL user hoge 追加(どこからでもOKユーザー) mysql_user: name=hoge host=% password=hoge priv=DB_NAME.*:ALL state=present
- name: ec2インスタンスを作成する ec2: aws_access_key: アクセスキー aws_secret_key: シークレットキー region: ap-northeast-1 instance_type: t2.micro keypair: キーペア名称 group: セキュリティグループ(複数ある場合はカンマ区切り) image: AMIイメージID vpc_subnet_id: サブネットID assign_public_ip: yes wait: yes instance_tags: Name: 名前 volumes: - device_name: /dev/xvda snapshot: snap-07b5593c→AMIが利用しているsnapshot IP volume_size: 100 register: ec2_status tags: create
- name: .ssh/configに追記 shell: >- echo Host awshost >> ~/.ssh/config; echo User ec2-user >> ~/.ssh/config; echo HostName {{ ec2_status.instances[0].public_ip }} >> ~/.ssh/config; echo IdentityFile ~/.ssh/YOUR_KEY.pem >> ~/.ssh/config; tags: ssh_config
インスタンスID | ec2_status.instances[0].ID |
private_ip | ec2_status.instances[0].private_ip |
public_ip | ec2_status.instances[0].public_ip |
- name: S3からMasterのIPをダウンロードする s3: aws_access_key: aws_secret_key: region: ap-northeast-1 bucket: バケット名 dest: /var/tmp/任意のパス object: /バケット名以下のパス/ファイル名 mode: get
置換に便利なモジュール
- name: tomcat memory setting lineinfile: dest: /etc/tomcat8/tomcat8.conf line: JAVA_OPTS="-server"
lineinfile: dest: /etc/tomcat8/tomcat8.conf regexp: ^JAVA_HOME line: JAVA_HOME="/usr/local/java/jdk1.8.0"
リモートでOSコマンドを実施する。
# Example from Ansible Playbooks. - command: /sbin/shutdown -t now # createsに指定されたファイルがない場合はcommandの処理を実行 - command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database
# somedir以下に移動し、かつ # createsに指定されたファイルがない場合はcommandの処理を実行 - command: /usr/bin/make_database.sh arg1 arg2 args: chdir: somedir/ creates: /path/to/database
#繰り返し処理のサンプル。変数定義済みであればwith_items:{{users}}でもOK - name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
#コンパイルのタスクだが、実際にはシェルが実行できるのでなんでもOK - name: Apacheコンパイル shell: make chdir=/usr/local/src/httpd-2.4.12 creates=/usr/local/apache/2.4.12/bin/httpd
操作先にShellを送り込んで実行。操作先にpythonが必要ないのもメリット
Ansibleの実行サーバー先にあるshファイルをリモートに送り込んで実行できる。
http://d.hatena.ne.jp/akishin999/20130818/1376824640
実行時の環境変数で設定 | export ANSIBLE_HOST_KEY_CHECKING=False |
- name: OK -name: NG
ローカルのパーミッションがNGだと内部モジュールでエラーがでてわかりづらい。コピー元はtemplateディレクトリに入れておくべき!
考えてみりゃそりゃーそうだ。というわけで条件に使っている変数はグローバルなので変に共有しないこと!
変数は{{}}で囲まないので注意
- user: root hosts: all tasks: - name: install mlocate yum: name=mlocate state=installed when: install == "y"
公開鍵が保持されていないとエラー。以下の記事を参考に自動化できぬものか!
http://qiita.com/kawaz/items/20983ec286088a1ae5c7
--ask-passオプションをつけるとSSHパスワード接続で実行できるが、sshpass.x86_64をyumインストールしておく必要がある。パスワードだとキーチェックが入るので一回接続しておくか、下記で無効にしておく。
export ANSIBLE_HOST_KEY_CHECKING=False
target uses selinux but python bindings (libselinux-python) aren't installed!
無効にしてしまう!
the python mysqldb module is required
マルチバイトがあるのが残念なので、以下のコマンドで見つけて治す。
find . | grep \[^\ a-zA-Z0-9_:/@,%\\=\;\'\&\\\[\\+\\\(\\\)\\!\\.\\\-\]
接続先がproxy必須の場合、Linuxの設定としてproxyをセットするのがよいかも!